/*
* RapidMiner
*
* Copyright (C) 2001-2008 by Rapid-I and the contributors
*
* Complete list of developers available at our web site:
*
* http://rapid-i.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*/
package com.rapidminer.gui.look.fc;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
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.util.Enumeration;
import java.util.Vector;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JViewport;
import javax.swing.SwingConstants;
import com.rapidminer.gui.look.RapidLookTools;
/**
* A panel containing all items (files etc.)
*
* @author Ingo Mierswa
* @version $Id: ItemPanel.java,v 1.2 2008/05/09 19:22:53 ingomierswa Exp $
*/
public class ItemPanel extends JPanel implements MouseListener, MouseMotionListener {
private static final long serialVersionUID = -4300786583560333090L;
private int visiblesCount = 0;
private DragSelectionThread selectingThread;
private int mpcy = 0, mpcx = 0, mpy = 0, mpx = 0;
private int tx = 0, ty = 0;
private boolean mouseDownFlag = false;
private Item tempItem;
private Rectangle selectionRect;
protected FileList filePane;
private boolean pointChanged = false;
private Rectangle scrollRect = new Rectangle(0, 0, 0, 0);
private JPopupMenu popup;
private ItemPanelKeyboardListener keylistener = new ItemPanelKeyboardListener();
private Enumeration en;
private Item tc;
private int totalColumn;
private int maxWidth;
public ItemPanel(FileList parent) {
this.addMouseMotionListener(this);
this.addMouseListener(this);
this.addKeyListener(this.keylistener);
this.setLayout(null);
this.filePane = parent;
this.setBackground(Color.white);
this.popup = this.filePane.getPanePopup();
this.selectingThread = new DragSelectionThread(this, this.filePane);
}
public FileList getFilePane() {
return this.filePane;
}
@Override
public void paint(Graphics g) {
determinePreferredSize();
super.paint(g);
if (this.filePane.fc.isMultiSelectionEnabled()) {
if (this.pointChanged) {
if (this.mpcx < 0) {
this.tx = this.mpcx + this.mpx;
this.mpcx *= -1;
} else {
this.tx = this.mpx;
}
if (this.mpcy < 0) {
this.ty = this.mpcy + this.mpy;
this.mpcy *= -1;
} else {
this.ty = this.mpy;
}
this.pointChanged = false;
}
this.selectionRect = new Rectangle(this.tx, this.ty, this.mpcx, this.mpcy);
if (this.mouseDownFlag) {
g.setColor(new Color(RapidLookTools.getColors().getFileChooserColors()[0].getRed(), RapidLookTools.getColors().getFileChooserColors()[0].getGreen(), RapidLookTools.getColors().getFileChooserColors()[0].getBlue(), 40));
g.fillRect(this.tx, this.ty, this.mpcx, this.mpcy);
g.setColor(RapidLookTools.getColors().getFileChooserColors()[0]);
g.drawRect(this.tx, this.ty, this.mpcx, this.mpcy);
updateSelectionsForDrag();
}
}
}
private void determinePreferredSize() {
this.en = this.filePane.visibleItemsList.elements();
int w = 0, h = 0;
while (this.en.hasMoreElements()) {
this.tempItem = (Item) this.en.nextElement();
if ((this.tempItem.getX() + this.tempItem.getWidth()) > w) {
w = this.tempItem.getX() + this.tempItem.getWidth();
}
if ((this.tempItem.getY() + this.tempItem.getHeight()) > h) {
h = this.tempItem.getY() + this.tempItem.getHeight();
}
}
this.setPreferredSize(new Dimension(w + 20, h + 20));
this.revalidate();
this.setPreferredSize(new Dimension(w + 20, h + 20));
this.setMinimumSize(new Dimension(w + 20, h + 20));
}
private void updateSelectionsForDrag() {
this.selectingThread.startThread(this.selectionRect);
}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {
this.filePane.clearSelectedItemsList();
requestFocusInWindow();
this.mpx = e.getX();
this.mpy = e.getY();
this.mouseDownFlag = true;
evaluateClick(e);
}
private void evaluateClick(MouseEvent e) {
if (e.isPopupTrigger()) {
this.popup.show(e.getComponent(), e.getX(), e.getY());
}
}
public void mouseReleased(MouseEvent e) {
resetPane();
evaluateClick(e);
}
private void resetPane() {
this.mouseDownFlag = false;
this.mpcx = 0;
this.mpcy = 0;
this.mpx = 0;
this.mpy = 0;
this.tx = 0;
this.ty = 0;
repaint();
}
public void moveSelectedItems(int difX, int difY) {
Enumeration en = this.filePane.selectedFilesVector.elements();
while (en.hasMoreElements()) {
this.tempItem = (Item) en.nextElement();
}
}
public void mouseDragged(MouseEvent e) {
this.mpcx = e.getX() - this.mpx;
this.mpcy = e.getY() - this.mpy;
this.pointChanged = true;
this.scrollRect = new Rectangle(e.getX(), e.getY(), 1, 1);
this.scrollRectToVisible(this.scrollRect);
repaint();
}
public void mouseMoved(MouseEvent e) {}
public void selectedComponentMousePressed(MouseEvent e) {
this.en = this.filePane.selectedFilesVector.elements();
while (this.en.hasMoreElements()) {
this.tempItem = (Item) this.en.nextElement();
this.tempItem.componentMousePressed(e);
}
}
public void selectedComponentMouseReleased(MouseEvent e) {
this.en = this.filePane.selectedFilesVector.elements();
while (this.en.hasMoreElements()) {
this.tempItem = (Item) this.en.nextElement();
this.tempItem.componentMouseReleased(e);
}
this.determinePreferredSize();
}
public void selectedComponentMouseDragged(Point point) {
this.en = this.filePane.selectedFilesVector.elements();
while (this.en.hasMoreElements()) {
this.tempItem = (Item) this.en.nextElement();
this.tempItem.componentMouseDragged(point);
}
this.scrollRectToVisible(this.filePane.lastSelected.getBounds());
}
protected void arrangeTheFiles() {
arrangeTheFiles((int) ((JComponent) this.getParent().getParent().getParent()).getSize().getWidth());
}
protected void arrangeTheFiles(int w) {
this.en = this.filePane.visibleItemsList.elements();
int counter = 0, r, c;
if (this.filePane.filechooserUI.viewType.equals(FileChooserUI.FILECHOOSER_VIEW_THUMBNAIL)) {
this.totalColumn = (w - 30) / 130;
this.visiblesCount = 0;
if (this.totalColumn < 1) {
this.totalColumn = 1;
}
while (this.en.hasMoreElements()) {
this.tc = (Item) this.en.nextElement();
this.tc.setVisible(true);
r = counter / this.totalColumn;
c = counter % this.totalColumn;
this.tc.setLocation((c * 130) + 30, (r * 150) + 30);
counter++;
this.visiblesCount++;
}
} else if (this.filePane.filechooserUI.viewType.equals(FileChooserUI.FILECHOOSER_VIEW_ICON)) {
this.totalColumn = (w - 30) / 90;
this.visiblesCount = 0;
if (this.totalColumn < 1) {
this.totalColumn = 1;
}
while (this.en.hasMoreElements()) {
this.tc = (Item) this.en.nextElement();
r = counter / this.totalColumn;
c = counter % this.totalColumn;
this.tc.setLocation((c * 90) + 20, (r * 100) + 20);
counter++;
this.visiblesCount++;
}
} else if (this.filePane.filechooserUI.viewType.equals(FileChooserUI.FILECHOOSER_VIEW_LIST)) {
if (this.maxWidth == 0) {
return;
}
this.visiblesCount = 0;
this.totalColumn = (w - 30) / (this.maxWidth + 30);
if (this.totalColumn < 1) {
this.totalColumn = 1;
}
while (this.en.hasMoreElements()) {
this.tc = (Item) this.en.nextElement();
this.tc.setVisible(true);
r = counter / this.totalColumn;
c = counter % this.totalColumn;
this.tc.setLocation(c * (this.maxWidth + 30) + (c + 1) * 10, (r * 18) + 10);
counter++;
this.visiblesCount++;
}
}
repaint();
}
public void findBestConfig(Item thumb) {
int r = 0, c = 0;
int counter = this.filePane.visibleItemsList.size() - 1;
if (this.filePane.filechooserUI.getView().equals(FileChooserUI.FILECHOOSER_VIEW_LIST)) {
updateForListView(thumb);
if (this.totalColumn == 0) {
this.totalColumn = 1;
}
r = counter / this.totalColumn;
c = counter % this.totalColumn;
thumb.setLocation(c * (this.maxWidth + 30) + (c + 1) * 10, (r * 18) + 10);
} else if (this.filePane.filechooserUI.viewType.equals(FileChooserUI.FILECHOOSER_VIEW_ICON)) {
updateForIconView(thumb);
r = counter / this.totalColumn;
c = counter % this.totalColumn;
thumb.setLocation((c * 90) + 20, (r * 100) + 20);
} else if (this.filePane.filechooserUI.viewType.equals(FileChooserUI.FILECHOOSER_VIEW_THUMBNAIL)) {
updateForThumbnailView(thumb);
r = counter / this.totalColumn;
c = counter % this.totalColumn;
thumb.setLocation((c * 130) + 30, (r * 150) + 30);
}
}
public void updateForViewAndArrange() {
if (this.filePane.filechooserUI.getView().equals(FileChooserUI.FILECHOOSER_VIEW_THUMBNAIL)) {
this.en = this.filePane.visibleItemsList.elements();
while (this.en.hasMoreElements()) {
updateForThumbnailView((Item) this.en.nextElement());
}
this.filePane.updateThumbnail();
} else if (this.filePane.filechooserUI.viewType.equals(FileChooserUI.FILECHOOSER_VIEW_ICON)) {
this.en = this.filePane.visibleItemsList.elements();
while (this.en.hasMoreElements()) {
updateForIconView((Item) this.en.nextElement());
}
} else if (this.filePane.filechooserUI.viewType.equals(FileChooserUI.FILECHOOSER_VIEW_LIST)) {
this.en = this.filePane.visibleItemsList.elements();
while (this.en.hasMoreElements()) {
updateForListView((Item) this.en.nextElement());
}
this.en = this.filePane.visibleItemsList.elements();
this.maxWidth = 0;
while (this.en.hasMoreElements()) {
this.tc = (Item) this.en.nextElement();
if (this.tc.imageLabel.getPreferredSize().getWidth() + this.tc.nameLabel.getPreferredLineWidth() > this.maxWidth) {
this.maxWidth = (int) (this.tc.imageLabel.getPreferredSize().getWidth() + this.tc.nameLabel.getPreferredLineWidth());
}
}
}
this.en = this.filePane.selectedFilesVector.elements();
while (this.en.hasMoreElements()) {
this.tempItem = (Item) this.en.nextElement();
if (!this.filePane.filechooserUI.getView().equals(FileChooserUI.FILECHOOSER_VIEW_LIST)) {
this.tempItem.nameLabel.setMultiLine(true);
}
this.tempItem.updateSelectionMode(true);
}
arrangeTheFiles();
}
public void updateForListView(Item tc) {
tc.nameLabel.setMultiLine(false);
tc.setBestSize(tc.nameLabel.getPreferredLineWidth() + 25, 18);
tc.setSize(tc.getBestSize());
tc.setLayout(new BorderLayout());
tc.remove(tc.imageLabel);
tc.remove(tc.nameLabel);
tc.setBorder(null);
tc.imageLabel.setBorder(Item.emptyImageBorder);
tc.nameLabel.setBorder(Item.emptyImageBorder);
tc.nameLabel.setHorizontalAlignment(SwingConstants.LEFT);
tc.add(tc.imageLabel, BorderLayout.WEST);
tc.add(tc.nameLabel, BorderLayout.CENTER);
tc.updateItemIcon();
}
private void updateForIconView(Item tc) {
tc.setBestSize(80, 70);
tc.setPreferredSize(tc.getBestSize());
tc.setSize(tc.getBestSize());
tc.nameLabel.setSize(80, tc.nameLabel.getPreferredLineHeight());
tc.setLayout(new BorderLayout());
tc.remove(tc.imageLabel);
tc.remove(tc.nameLabel);
tc.imageLabel.setBorder(Item.emptyImageBorder);
tc.setBorder(Item.defaultThumbBorder);
tc.nameLabel.setHorizontalAlignment(SwingConstants.CENTER);
tc.imageLabel.setVerticalAlignment(javax.swing.SwingConstants.CENTER);
tc.imageLabel.setHorizontalAlignment(SwingConstants.CENTER);
tc.add(tc.imageLabel, BorderLayout.CENTER);
tc.add(tc.nameLabel, BorderLayout.SOUTH);
tc.setSelectionMode(false);
tc.nameLabel.setMultiLine(false);
tc.revalidate();
tc.updateItemIcon();
}
private void updateForThumbnailView(Item tc) {
tc.setBestSize(105, 105 + tc.nameLabel.getPreferredLineHeight());
tc.setPreferredSize(tc.getBestSize());
tc.setSize(tc.getBestSize());
tc.nameLabel.setSize(105, tc.nameLabel.getPreferredLineHeight());
tc.setLayout(new BorderLayout());
tc.remove(tc.imageLabel);
tc.remove(tc.nameLabel);
tc.nameLabel.setHorizontalAlignment(SwingConstants.CENTER);
tc.imageLabel.setVerticalAlignment(javax.swing.SwingConstants.CENTER);
tc.imageLabel.setHorizontalAlignment(SwingConstants.CENTER);
tc.imageLabel.setBorder(Item.grayImageBorder);
tc.setBorder(Item.defaultThumbBorder);
tc.add(tc.imageLabel, BorderLayout.CENTER);
tc.add(tc.nameLabel, BorderLayout.SOUTH);
tc.setSelectionMode(false);
tc.nameLabel.setMultiLine(false);
tc.revalidate();
tc.updateItemIcon();
}
public void updateViewType() {
updateForViewAndArrange();
}
public void useKeyMoves(String str, boolean isCtrl) {
if ((this.filePane.lastSelected == null) || (this.filePane.visibleItemsList.size() == 0)) {
return;
}
Item tempLast = this.filePane.lastSelected;
Point center = new Point();
Point mainCenter = this.filePane.lastSelected.getLocation();
Item res = this.filePane.lastSelected;
if (str.equals("HOME")) {
this.filePane.updateFilechooserSelectedItems(this.filePane.visibleItemsList.elementAt(0), isCtrl);
}
if (str.equals("END")) {
this.filePane.updateFilechooserSelectedItems(this.filePane.visibleItemsList.elementAt(this.filePane.visibleItemsList.size() - 1), isCtrl);
}
if (str.equals("SPACE")) {
this.filePane.updateFilechooserSelectedItems(this.filePane.lastSelected, false);
}
if (str.equals("PAGE_UP")) {
int n = this.filePane.visibleItemsList.indexOf(this.filePane.lastSelected);
if (n >= 0) {
tempLast = this.filePane.lastSelected;
} else {
return;
}
boolean flag = true;
mainCenter = res.getLocation();
tempLast = res;
while (flag) {
res = tempLast;
mainCenter = tempLast.getLocation();
this.en = this.filePane.visibleItemsList.elements();
while (this.en.hasMoreElements()) {
this.tc = (Item) this.en.nextElement();
center = this.tc.getLocation();
if (mainCenter.getY() > center.getY()) {
if ((res.getLocation().distance(tempLast.getLocation()) == 0) || (this.tc.getLocation().distance(tempLast.getLocation()) < res.getLocation().distance(tempLast.getLocation()))) {
res = this.tc;
}
}
}
if ((((JViewport) this.getParent()).getViewRect().getHeight() < res.getLocation().distance(this.filePane.lastSelected.getLocation())) || tempLast.getFileName().equals(res.getFileName())) {
flag = false;
this.filePane.updateFilechooserSelectedItems(tempLast, isCtrl);
} else {
tempLast = res;
}
}
} else if (str.equals("PAGE_DOWN")) {
int n = this.filePane.visibleItemsList.indexOf(this.filePane.lastSelected);
if (n >= 0) {
tempLast = this.filePane.lastSelected;
} else {
return;
}
boolean flag = true;
mainCenter = res.getLocation();
// res=null;
tempLast = res;
while (flag) {
res = tempLast;
mainCenter = tempLast.getLocation();
this.en = this.filePane.visibleItemsList.elements();
while (this.en.hasMoreElements()) {
this.tc = (Item) this.en.nextElement();
center = this.tc.getLocation();
if (mainCenter.getY() < center.getY()) {
if ((res.getLocation().distance(tempLast.getLocation()) == 0) || (this.tc.getLocation().distance(tempLast.getLocation()) < res.getLocation().distance(tempLast.getLocation()))) {
res = this.tc;
}
}
}
if ((((JViewport) this.getParent()).getViewRect().getHeight() < res.getLocation().distance(this.filePane.lastSelected.getLocation())) || tempLast.getFileName().equals(res.getFileName())) {
flag = false;
this.filePane.updateFilechooserSelectedItems(tempLast, isCtrl);
this.scrollRectToVisible(this.filePane.lastSelected.getBounds());
} else {
tempLast = res;
}
}
} else if (str.equals("DOWN")) {
this.en = this.filePane.visibleItemsList.elements();
while (this.en.hasMoreElements()) {
this.tc = (Item) this.en.nextElement();
center = this.tc.getLocation();
if (mainCenter.getY() < center.getY()) {
if ((res.getLocation().distance(this.filePane.lastSelected.getLocation()) == 0) || (this.tc.getLocation().distance(this.filePane.lastSelected.getLocation()) < res.getLocation().distance(this.filePane.lastSelected.getLocation()))) {
res = this.tc;
}
}
}
this.filePane.updateFilechooserSelectedItems(res, isCtrl);
} else if (str.equals("UP")) {
this.en = this.filePane.visibleItemsList.elements();
while (this.en.hasMoreElements()) {
this.tc = (Item) this.en.nextElement();
center = this.tc.getLocation();
if (mainCenter.getY() > center.getY()) {
if ((res.getLocation().distance(this.filePane.lastSelected.getLocation()) == 0) || (this.tc.getLocation().distance(this.filePane.lastSelected.getLocation()) < res.getLocation().distance(this.filePane.lastSelected.getLocation()))) {
res = this.tc;
}
}
}
this.filePane.updateFilechooserSelectedItems(res, isCtrl);
} else if (str.equals("LEFT")) {
this.en = this.filePane.visibleItemsList.elements();
while (this.en.hasMoreElements()) {
this.tc = (Item) this.en.nextElement();
center = this.tc.getLocation();
if (mainCenter.getX() > center.getX()) {
if ((res.getLocation().distance(this.filePane.lastSelected.getLocation()) == 0) || (this.tc.getLocation().distance(this.filePane.lastSelected.getLocation()) < res.getLocation().distance(this.filePane.lastSelected.getLocation()))) {
res = this.tc;
}
}
}
this.filePane.updateFilechooserSelectedItems(res, isCtrl);
} else if (str.equals("RIGHT")) {
this.en = this.filePane.visibleItemsList.elements();
while (this.en.hasMoreElements()) {
this.tc = (Item) this.en.nextElement();
center = this.tc.getLocation();
if (mainCenter.getX() < center.getX()) {
if ((res.getLocation().distance(this.filePane.lastSelected.getLocation()) == 0) || (this.tc.getLocation().distance(this.filePane.lastSelected.getLocation()) < res.getLocation().distance(this.filePane.lastSelected.getLocation()))) {
res = this.tc;
}
}
}
this.filePane.updateFilechooserSelectedItems(res, isCtrl);
}
}
public String getCurrentView() {
return this.filePane.filechooserUI.viewType;
}
public Vector getItemsList() {
return this.filePane.visibleItemsList;
}
public void forwardToNearestFor(String pre) {
int index = this.filePane.visibleItemsList.indexOf(this.filePane.lastSelected) + 1;
for (int i = 0; i < this.filePane.visibleItemsList.size(); i++) {
if (index == this.filePane.visibleItemsList.size()) {
index = 0;
}
if (this.filePane.visibleItemsList.elementAt(index).getFileName().toLowerCase().startsWith(pre)) {
this.filePane.updateFilechooserSelectedItems(this.filePane.visibleItemsList.elementAt(index), false);
break;
}
index++;
}
}
}