/*
* Software Name : ATK
*
* Copyright (C) 2007 - 2012 France Télécom
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* ------------------------------------------------------------------
* File Name : ListMask.java
*
* Created : 10/05/2010
* Author(s) : Gurvan LE QUELLENEC
*/
package com.orange.atk.compUI;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
import javax.swing.ListSelectionModel;
import javax.swing.UIManager;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import com.orange.atk.compModel.ImageFileMask;
import com.orange.atk.compModel.Mask;
public class ListMask {
ComparatorFrame comparatorFrame;
/**
* This listbox that holds the checkboxes
*/
private JList listCheckBox;
private DefaultListModel listCheckBoxModel;
/**
* This listbox that holds the actual list of masks
*/
private JList listMask;
private DefaultListModel listMaskModel;
/*
* Border around each mask
*/
private static final Color colorBorder = Color.RED;
private static final int sizeBorder = 2;
/*
* the cells change colors when the mask is selected
*/
private static final Color colorCell = Color.BLACK;
private static final Color colorCellSelected = Color.YELLOW;
private static final int sizeCell = 3;
private static final int sizeCellFill = 2;
/*
* Interval around the mask
*/
private static final int sizeInterval = 5;
private static final Color colorBackgroundSelected = new Color(250,250,125);
private int imageHeight = 130;
private int imageWidth = 100;
/*
* Size of the mask
*/
private int maskHeight = 0;
private int maskWidth = 0;
public ListMask(Mask[] listMasks, ComparatorFrame frame,int width, int height){
maskWidth = width;
maskHeight = height;
imageHeight = maskHeight*sizeCell + (sizeInterval+sizeBorder)*2;
imageWidth = maskWidth*sizeCell + (sizeInterval+sizeBorder)*2;
comparatorFrame = frame;
listCheckBoxModel = new DefaultListModel();
listCheckBox = new JList(listCheckBoxModel);
listMaskModel = new DefaultListModel();
listMask = new JList(listMaskModel);
this.add(listMasks);
listMask.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
listMask.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
comparatorFrame.update(comparatorFrame.getGraphics());
}
});
listCheckBox.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent me) {
int selectedIndex = listCheckBox.locationToIndex(me.getPoint());
if (selectedIndex < 0)
return;
CheckBoxItem item = (CheckBoxItem)listCheckBoxModel.getElementAt(selectedIndex);
item.setChecked(!item.isChecked());
listMask.setSelectedIndex(selectedIndex);
listCheckBox.repaint();
updateCurrentImage(((Mask)listMaskModel.get(selectedIndex)).getId(),item.isChecked());
}
});
// Align both the checkbox height and width
listMask.setFixedCellHeight(imageHeight);
listCheckBox.setFixedCellHeight(listMask.getFixedCellHeight());
listCheckBox.setFixedCellWidth(20);
listMask.setCellRenderer(new ListMaskRenderer(listCheckBoxModel));
listCheckBox.setCellRenderer(new CheckBoxRenderer());
listCheckBox.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
public int getMaskHeight() {
return maskHeight;
}
public int getMaskWidth() {
return maskWidth;
}
public void add(Mask mask) {
listCheckBoxModel.addElement(new CheckBoxItem());
listMaskModel.addElement(mask);
}
private void add(Mask[] listMask) {
for(Mask mask : listMask){
listCheckBoxModel.addElement(new CheckBoxItem());
listMaskModel.addElement(mask);
}
}
public void removeMask(Mask mask) {
int index = listMaskModel.indexOf(mask);
listCheckBoxModel.remove(index);
listMaskModel.remove(index);
}
public JList getListCheckBox() {
return listCheckBox;
}
public JList getListLabel() {
return listMask;
}
/**
* Get at list of Mask Id and update the list of mask by
* checking or unchecking the selected masks.
* @param listMaskId
*/
public void setListCheckBox(ArrayList<Integer> listMaskId){
for(int i=0; i<listMaskModel.getSize();i++){
if(listMaskId.contains(((Mask)listMaskModel.get(i)).getId()))
((CheckBoxItem)listCheckBoxModel.getElementAt(i)).setChecked(true);
else
((CheckBoxItem)listCheckBoxModel.getElementAt(i)).setChecked(false);
}
listCheckBox.repaint();
}
/**
* Update the list of masks for the current Image of reference (in the main Frame)
* from the list of masks selected.
*/
private void updateCurrentImage(Integer Id, Boolean check) {
ImageFileMask imageMask = comparatorFrame.getCurrentImgRef();
if(check)
imageMask.addMask(Id);
else
imageMask.removeMask(Id);
comparatorFrame.update(comparatorFrame.getGraphics());
comparatorFrame.getModel().saveMaskAssociations();
}
public void setSelectedMask(Mask mask){
listMask.setSelectedIndex(listMaskModel.indexOf(mask));
}
public void checkSelectedMask(Mask mask){
int index = listMaskModel.indexOf(mask);
if (index < 0)
return;
CheckBoxItem item = (CheckBoxItem)listCheckBoxModel.getElementAt(index);
item.setChecked(true);
listCheckBox.repaint();
updateCurrentImage(((Mask)listMaskModel.get(index)).getId(),item.isChecked());
}
public Mask getSelectedMask(){
if(listMask.getSelectedIndex()<0)
return null;
return (Mask) listMaskModel.elementAt(listMask.getSelectedIndex());
}
/**
* Inner class to hold data for JList with checkboxes
* @author Gurvan LE QUELLENEC
*/
private static class CheckBoxItem {
private boolean isChecked;
public CheckBoxItem() {
isChecked = false;
}
public boolean isChecked() {
return isChecked;
}
public void setChecked(boolean value) {
isChecked = value;
}
}
/**
* Repaint the list of mask
*/
void repaint(){
listCheckBox.repaint();
}
/**
* Inner class that renders JCheckBox to JList
* @author Gurvan LE QUELLENEC
*/
@SuppressWarnings("serial")
private static class CheckBoxRenderer extends JCheckBox implements ListCellRenderer {
public CheckBoxRenderer() {
setBackground(UIManager.getColor("List.textBackground"));
setForeground(UIManager.getColor("List.textForeground"));
}
public Component getListCellRendererComponent(JList listBox, Object obj, int currentindex,
boolean isChecked, boolean hasFocus) {
setSelected(((CheckBoxItem)obj).isChecked());
return this;
}
}
/**
* Inner class that renders the list of the masks
* @author Gurvan LE QUELLENEC
*
*/
private class ListMaskRenderer implements ListCellRenderer {
private DefaultListModel listCheckBoxM;
public ListMaskRenderer(DefaultListModel listCheckBox) {
listCheckBoxM = listCheckBox;
}
public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean isSelected,
boolean hasFocus) {
JLabel label = new JLabel(value.toString());
BufferedImage image = new BufferedImage(imageWidth,imageHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = (Graphics2D) image.getGraphics();
Boolean isChecked = (Boolean)((CheckBoxItem)listCheckBoxM.get(index)).isChecked;
//set default value
g2d.setColor(Color.lightGray);
g2d.fillRect((int) sizeInterval,
(int) sizeInterval,
(int) maskWidth*sizeCell+2*sizeBorder,
(int) maskHeight*sizeCell+2*sizeBorder);
//We set the border in RED
g2d.setColor(colorBorder);
g2d.fillRect((int) sizeInterval,
(int) sizeInterval,
(int) maskWidth*sizeCell+2*sizeBorder,
(int) sizeBorder);
g2d.fillRect((int) sizeInterval,
(int) sizeInterval,
(int) sizeBorder,
(int) maskHeight*sizeCell+2*sizeBorder);
g2d.fillRect((int) sizeInterval,
(int) sizeInterval+maskHeight*sizeCell+sizeBorder,
(int) maskWidth*sizeCell+2*sizeBorder,
(int) sizeBorder);
g2d.fillRect((int) sizeInterval+maskWidth*sizeCell+sizeBorder,
(int) sizeInterval,
(int) sizeBorder,
(int) maskHeight*sizeCell+2*sizeBorder);
//We create the image with the mask
if(isSelected && isChecked)
g2d.setColor(colorCellSelected);
else
g2d.setColor(colorCell);
for (int x=0; x<maskWidth; x++){
for (int y=0; y<maskHeight; y++){
if (((Mask)value).getCell(x,y)){
g2d.fillRect(
(int) ((x)*sizeCell+sizeBorder+sizeInterval),
(int) ((y)*sizeCell+sizeBorder+sizeInterval) ,
sizeCellFill,
sizeCellFill);
}
}
}
if(isSelected){
label.setFont(new Font(null,Font.BOLD,22));
label.setOpaque(true);
label.setBackground(colorBackgroundSelected );
}else
label.setFont(new Font(null,Font.PLAIN,18));
label.setIcon(new ImageIcon(image));
return(label);
}
}
}