/**
* Copyright (C) 2001-2017 by RapidMiner and the contributors
*
* Complete list of developers available at our web site:
*
* http://rapidminer.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 com.rapidminer.gui.look.RapidLookTools;
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.Vector;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JViewport;
import javax.swing.SwingConstants;
/**
* A panel containing all items (files etc.)
*
* @author Ingo Mierswa
*/
public class ItemPanel extends JPanel implements MouseListener, MouseMotionListener {
private static final long serialVersionUID = -4300786583560333090L;
private DragSelectionThread selectingThread;
private int mpcy = 0, mpcx = 0, mpy = 0, mpx = 0;
private int tx = 0, ty = 0;
private boolean mouseDownFlag = false;
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 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() {
int w = 0, h = 0;
for (Item tempItem : filePane.visibleItemsList) {
if (tempItem.getX() + tempItem.getWidth() > w) {
w = tempItem.getX() + tempItem.getWidth();
}
if (tempItem.getY() + tempItem.getHeight() > h) {
h = tempItem.getY() + 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);
}
@Override
public void mouseClicked(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
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());
}
}
@Override
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();
}
/**
* @deprecated Since 7.4; did nothing
*/
@Deprecated
public void moveSelectedItems(int difX, int difY) {}
@Override
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();
}
@Override
public void mouseMoved(MouseEvent e) {}
public void selectedComponentMousePressed(MouseEvent e) {
for (Item tempItem : filePane.selectedFilesVector) {
tempItem.componentMousePressed(e);
}
}
public void selectedComponentMouseReleased(MouseEvent e) {
for (Item tempItem : filePane.selectedFilesVector) {
tempItem.componentMouseReleased(e);
}
this.determinePreferredSize();
}
public void selectedComponentMouseDragged(Point point) {
for (Item tempItem : filePane.selectedFilesVector) {
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) {
int counter = 0, r, c;
if (this.filePane.filechooserUI.viewType.equals(FileChooserUI.FILECHOOSER_VIEW_THUMBNAIL)) {
this.totalColumn = (w - 30) / 130;
if (this.totalColumn < 1) {
this.totalColumn = 1;
}
for (Item tc : filePane.visibleItemsList) {
tc.setVisible(true);
r = counter / this.totalColumn;
c = counter % this.totalColumn;
tc.setLocation(c * 130 + 30, r * 150 + 30);
counter++;
}
} else if (this.filePane.filechooserUI.viewType.equals(FileChooserUI.FILECHOOSER_VIEW_ICON)) {
this.totalColumn = (w - 30) / 90;
if (this.totalColumn < 1) {
this.totalColumn = 1;
}
for (Item tc : filePane.visibleItemsList) {
r = counter / this.totalColumn;
c = counter % this.totalColumn;
tc.setLocation(c * 90 + 20, r * 100 + 20);
counter++;
}
} else if (this.filePane.filechooserUI.viewType.equals(FileChooserUI.FILECHOOSER_VIEW_LIST)) {
if (this.maxWidth == 0) {
return;
}
this.totalColumn = (w - 30) / (this.maxWidth + 30);
if (this.totalColumn < 1) {
this.totalColumn = 1;
}
for (Item tc : filePane.visibleItemsList) {
tc.setVisible(true);
r = counter / this.totalColumn;
c = counter % this.totalColumn;
tc.setLocation(c * (this.maxWidth + 30) + (c + 1) * 10, r * 18 + 10);
counter++;
}
}
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)) {
for (Item item : filePane.visibleItemsList) {
updateForThumbnailView(item);
}
this.filePane.updateThumbnail();
} else if (this.filePane.filechooserUI.viewType.equals(FileChooserUI.FILECHOOSER_VIEW_ICON)) {
for (Item item : filePane.visibleItemsList) {
updateForIconView(item);
}
} else if (this.filePane.filechooserUI.viewType.equals(FileChooserUI.FILECHOOSER_VIEW_LIST)) {
for (Item item : filePane.visibleItemsList) {
updateForListView(item);
}
this.maxWidth = 0;
for (Item tc : filePane.visibleItemsList) {
if (tc.imageLabel.getPreferredSize().getWidth() + tc.nameLabel.getPreferredLineWidth() > this.maxWidth) {
this.maxWidth = (int) (tc.imageLabel.getPreferredSize().getWidth()
+ tc.nameLabel.getPreferredLineWidth());
}
}
}
for (Item tempItem : filePane.selectedFilesVector) {
if (!this.filePane.filechooserUI.getView().equals(FileChooserUI.FILECHOOSER_VIEW_LIST)) {
tempItem.nameLabel.setMultiLine(true);
}
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();
for (Item tc : filePane.visibleItemsList) {
center = tc.getLocation();
if (mainCenter.getY() > center.getY()) {
if (res.getLocation().distance(tempLast.getLocation()) == 0 || tc.getLocation()
.distance(tempLast.getLocation()) < res.getLocation().distance(tempLast.getLocation())) {
res = 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();
for (Item tc : filePane.visibleItemsList) {
center = tc.getLocation();
if (mainCenter.getY() < center.getY()) {
if (res.getLocation().distance(tempLast.getLocation()) == 0 || tc.getLocation()
.distance(tempLast.getLocation()) < res.getLocation().distance(tempLast.getLocation())) {
res = 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")) {
for (Item tc : filePane.visibleItemsList) {
center = tc.getLocation();
if (mainCenter.getY() < center.getY()) {
if (res.getLocation().distance(this.filePane.lastSelected.getLocation()) == 0
|| tc.getLocation().distance(this.filePane.lastSelected.getLocation()) < res.getLocation()
.distance(this.filePane.lastSelected.getLocation())) {
res = tc;
}
}
}
this.filePane.updateFilechooserSelectedItems(res, isCtrl);
} else if (str.equals("UP")) {
for (Item tc : filePane.visibleItemsList) {
center = tc.getLocation();
if (mainCenter.getY() > center.getY()) {
if (res.getLocation().distance(this.filePane.lastSelected.getLocation()) == 0
|| tc.getLocation().distance(this.filePane.lastSelected.getLocation()) < res.getLocation()
.distance(this.filePane.lastSelected.getLocation())) {
res = tc;
}
}
}
this.filePane.updateFilechooserSelectedItems(res, isCtrl);
} else if (str.equals("LEFT")) {
for (Item tc : filePane.visibleItemsList) {
center = tc.getLocation();
if (mainCenter.getX() > center.getX()) {
if (res.getLocation().distance(this.filePane.lastSelected.getLocation()) == 0
|| tc.getLocation().distance(this.filePane.lastSelected.getLocation()) < res.getLocation()
.distance(this.filePane.lastSelected.getLocation())) {
res = tc;
}
}
}
this.filePane.updateFilechooserSelectedItems(res, isCtrl);
} else if (str.equals("RIGHT")) {
for (Item tc : filePane.visibleItemsList) {
center = tc.getLocation();
if (mainCenter.getX() < center.getX()) {
if (res.getLocation().distance(this.filePane.lastSelected.getLocation()) == 0
|| tc.getLocation().distance(this.filePane.lastSelected.getLocation()) < res.getLocation()
.distance(this.filePane.lastSelected.getLocation())) {
res = tc;
}
}
}
this.filePane.updateFilechooserSelectedItems(res, isCtrl);
}
}
public String getCurrentView() {
return this.filePane.filechooserUI.viewType;
}
public Vector<Item> 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++;
}
}
}