/*
* Copyright (C) 2008-2015 by Holger Arndt
*
* This file is part of the Universal Java Matrix Package (UJMP).
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership and licensing.
*
* UJMP is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* UJMP 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with UJMP; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
package org.ujmp.gui.statusbar;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.TimerTask;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import org.ujmp.core.Coordinates;
import org.ujmp.core.interfaces.GUIObject;
import org.ujmp.core.util.UJMPTimer;
import org.ujmp.gui.MatrixGUIObject;
import org.ujmp.gui.util.TaskQueue;
public class StatusBar extends JPanel {
private static final long serialVersionUID = -92341245296146976L;
private final JLabel statusLabel = new JLabel();
private final GUIObject guiObject;
private final JProgressBar jProgressBar = new JProgressBar();
private final UJMPTimer timer;
public StatusBar(GUIObject o) {
this.guiObject = o;
this.setPreferredSize(new Dimension(1000, 30));
this.setBorder(BorderFactory.createEtchedBorder());
this.setLayout(new GridBagLayout());
statusLabel.setPreferredSize(new Dimension(2000, 30));
statusLabel.setMinimumSize(new Dimension(200, 30));
add(statusLabel, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0, GridBagConstraints.EAST, GridBagConstraints.BOTH,
new Insets(2, 2, 2, 2), 0, 0));
add(new MemoryUsage(), new GridBagConstraints(3, 0, 1, 1, 0.0, 1.0, GridBagConstraints.EAST,
GridBagConstraints.BOTH, new Insets(2, 2, 2, 2), 0, 0));
jProgressBar.setStringPainted(false);
jProgressBar.setMinimum(0);
jProgressBar.setMaximum(1000);
jProgressBar.setValue(1000);
jProgressBar.setVisible(false);
statusLabel.setBorder(BorderFactory.createEtchedBorder());
jProgressBar.setBorder(BorderFactory.createEtchedBorder());
add(jProgressBar, new GridBagConstraints(1, 0, 1, 1, 0.8, 1.0, GridBagConstraints.EAST,
GridBagConstraints.BOTH, new Insets(2, 2, 2, 2), 0, 0));
timer = UJMPTimer.newInstance("StatusBar "+guiObject.getCoreObject().getClass().getSimpleName());
timer.schedule(new UpdateTask(this), 200, 200);
}
public void setStatusString(String s) {
statusLabel.setText(s);
}
public void setProgress(Double progress) {
if (progress == null) {
jProgressBar.setValue(0);
jProgressBar.setIndeterminate(true);
jProgressBar.setVisible(true);
} else if (progress == 1.0) {
jProgressBar.setValue(1000);
jProgressBar.setVisible(false);
} else {
int value = (int) (progress * jProgressBar.getMaximum());
jProgressBar.setIndeterminate(false);
jProgressBar.setValue(value);
jProgressBar.setVisible(true);
}
}
public GUIObject getObject() {
return guiObject;
}
class UpdateTask extends TimerTask {
private StatusBar statusBar = null;
public UpdateTask(StatusBar statusBar) {
this.statusBar = statusBar;
}
public void run() {
StringBuilder s = new StringBuilder();
if (guiObject instanceof MatrixGUIObject) {
MatrixGUIObject matrix = ((MatrixGUIObject) guiObject);
long[] c = matrix.getMouseOverCoordinates();
s.append("Position: ");
s.append(Coordinates.toString(c));
if (!matrix.getRowSelectionModel().isSelectionEmpty()
|| !matrix.getColumnSelectionModel().isSelectionEmpty()) {
long y0 = matrix.getRowSelectionModel().getMinSelectionIndex64();
long y1 = matrix.getRowSelectionModel().getMaxSelectionIndex64();
long x0 = matrix.getColumnSelectionModel().getMinSelectionIndex64();
long x1 = matrix.getColumnSelectionModel().getMaxSelectionIndex64();
long xSize = 1 + Math.abs(x1 - x0);
long ySize = 1 + Math.abs(y1 - y0);
s.append(" Selection: [" + y0 + "," + x0 + "] - [" + y1 + "," + x1 + "] = ");
s.append("[" + ySize + "x" + xSize + "]");
}
setStatusString(s.toString());
}
statusBar.setProgress(TaskQueue.getProgress());
}
}
}