/*
* @(#)CutView
*
* Copyright (c) 2006 by dvb.matt, All Rights Reserved.
*
* This file is part of ProjectX, a free Java based demux utility.
* By the authors, ProjectX is intended for educational purposes only,
* as a non-commercial test project.
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package net.sourceforge.dvb.projectx.gui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.MemoryImageSource;
import java.awt.Font;
import java.awt.GridLayout;
import java.util.Arrays;
import javax.swing.BoxLayout;
import javax.swing.JPanel;
/**
*
*/
public class CutView extends JPanel {
private final int Top = 15;
private final int Bottom = 188;
private int[] image_data;
private int width = 160;
private int height = 90;
private int sliderPosition = 175;
private Object index_top = null;
private Object index_bottom = null;
private boolean matchingPoint = false;
private boolean cut_top = true;
private boolean cut_bottom = false;
private boolean cut_match = false;
private boolean action = false;
private String string_bottom = "Next:";
private String string_top = "Prev:";
private String string_matchingpoint = "";
private String[] string_in_out = { " -IN- ", " -OUT- " };
private Image image_top;
private Image image_bottom;
private MemoryImageSource source_top;
private MemoryImageSource source_bottom;
private Color BackgroundColor;
private Color RedColor;
private Font font;
/**
*
*/
public CutView()
{
image_data = new int[width * height];
source_top = new MemoryImageSource(width, height, image_data, 0, width);
source_top.setAnimated(true);
image_top = createImage(source_top);
source_bottom = new MemoryImageSource(width, height, image_data, 0, width);
source_bottom.setAnimated(true);
image_bottom = createImage(source_bottom);
BackgroundColor = new Color(0, 35, 110);
RedColor = new Color(255, 100, 100);
font = new Font("Tahoma", Font.PLAIN, 12);
setPreferredSize(new Dimension(350, 120));
setMaximumSize(new Dimension(350, 120));
setMinimumSize(new Dimension(350, 120));
setBackground(Color.black);
setVisible(true);
}
/**
*
*/
public int getTop()
{
return Top;
}
/**
*
*/
public int getBottom()
{
return Bottom;
}
/**
*
*/
public Object getTopIndex()
{
return index_top;
}
/**
*
*/
public Object getBottomIndex()
{
return index_bottom;
}
/**
*
*/
public void setSlider(int val)
{
sliderPosition = val;
repaint();
}
/**
*
*/
public Object getPreviewPosition()
{
if (sliderPosition < 168)
return getTopIndex();
if (sliderPosition > 182)
return getBottomIndex();
return null;
}
/**
*
*/
public int getTransparencyValue()
{
double div = 255.0 / 168.0;
int factor = 0;
if (sliderPosition < 168)
factor = -sliderPosition + 168;
if (sliderPosition > 182)
factor = sliderPosition - 182;
div *= factor;
factor = (int) div;
factor = factor > 255 ? 255 : factor;
return factor;
}
/**
*
*/
public void clearViews()
{
matchingPoint = false;
clearView(Top);
clearView(Bottom);
CommonGui.getPicturePanel().setMixedPreviewPixel(null, 0);
}
/**
*
*/
public void clearView(int position)
{
Arrays.fill(image_data, 0xFF505050);
updateView(position);
}
/**
*
*/
public void updateView(int position)
{
updateView(position, null, -1);
}
/**
*
*/
public void updateView(int position, Object[] object, int index)
{
if (position < 100)
{
source_top.newPixels();
string_top = "Prev: " + (object != null ? "#" + (index + 1) + " - " + object[index] + string_in_out[index & 1] : "= Collection Begin");
cut_top = object != null ? (index & 1) == 0 : (!matchingPoint ? !cut_bottom : false);
index_top = object != null ? object[index] : null;
}
else
{
source_bottom.newPixels();
string_bottom = "Next: " + (object != null ? "#" + (index + 1) + " - " + object[index] + string_in_out[index & 1] : "= Collection End");
cut_bottom = object != null ? (index & 1) == 0 : false;
index_bottom = object != null ? object[index] : null;
}
repaint();
}
/**
*
*/
public void setImage(int[] data, Object[] object, int index, int position)
{
if (data == null)
{
clearView(position);
return;
}
scaleCutImage(data);
updateView(position, object, index);
}
/**
* create new smaller cutimage pixel data
*/
private void scaleCutImage(int[] data)
{
int source_width = 512;
int source_height = 288;
float Y = 0;
float X = 0;
float decimate_height = (float)source_height / height;
float decimate_width = (float)source_width / width;
for (int y = 0, tmp1, tmp2; Y < source_height && y < height; Y += decimate_height, y++, X = 0)
{
tmp1 = y * width;
tmp2 = (int)Y * source_width;
for (int x = 0; X < source_width && x < width; X += decimate_width, x++)
image_data[x + tmp1] = data[(int)X + tmp2];
}
}
/**
*
*/
public void setMatchingPoint(boolean b, Object[] object, int index)
{
matchingPoint = b;
string_matchingpoint = matchingPoint ? "This: #" + (index + 1) + " @ " + object[index] + string_in_out[index & 1] : "";
cut_match = (index & 1) == 0;
}
/**
*
*/
public void paint(Graphics g)
{
g.setColor(BackgroundColor);
g.fillRect(0, 0, 600, 120);
g.setFont(font);
g.setColor(cut_top ? Color.green : RedColor);
g.drawRect(2, Top - 1, width - 1, height + 1);
g.drawString(string_top, 2, Top - 4);
g.setColor(cut_bottom ? Color.green : RedColor);
// g.drawRect(0, Bottom - 1, width - 1, height + 1);
// g.drawString(string_bottom, 8, Bottom - 4);
g.drawRect(Bottom, Top - 1, width - 1, height + 1);
g.drawString(string_bottom, Bottom + 2, Top - 4);
if (matchingPoint)
{
g.setColor(cut_match ? Color.green : RedColor);
g.drawString(string_matchingpoint, 2, Bottom - 21);
}
g.drawImage(image_top, 2, Top, this);
// g.drawImage(image_bottom, 0, Bottom, this);
g.drawImage(image_bottom, Bottom, Top, this);
paintSlider(g);
}
/**
*
*/
public void paintSlider(Graphics g)
{
int i = 6;
g.setColor(cut_top ? Color.green : RedColor);
g.fillRect(i, 110, 40, 6);
g.fillRect(i + 44, 110, 32, 6);
g.fillRect(i + 80, 110, 24, 6);
g.fillRect(i + 108, 110, 16, 6);
g.fillRect(i + 128, 110, 10, 6);
g.fillRect(i + 142, 110, 6, 6);
g.fillRect(i + 152, 110, 4, 6);
g.setColor(cut_bottom ? Color.green : RedColor);
g.fillRect(Bottom, 110, 4, 6);
g.fillRect(Bottom + 8, 110, 6, 6);
g.fillRect(Bottom + 18, 110, 10, 6);
g.fillRect(Bottom + 32, 110, 16, 6);
g.fillRect(Bottom + 52, 110, 24, 6);
g.fillRect(Bottom + 80, 110, 32, 6);
g.fillRect(Bottom + 116, 110, 40, 6);
g.setColor(Color.yellow);
g.drawRect(sliderPosition - 7, 108, 14, 10);
}
}