/*
* Projet : Trustopics
* Version : 0.2.1
* Fichier : RoundViewPort.java
*/
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JViewport;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class RoundViewPort extends JPanel {
private int glb_widthBar = 40;
private int glb_heightBar = 0;
private int glb_YMousePressed;
private int glb_YMouse;
private JTextArea glb_textArea;
private JViewport glb_viewPort;
private ScrollZone glb_scrollZone;
private ScrollBar glb_scrollBar;
public RoundViewPort(JTextArea prm_textArea) {
glb_textArea = prm_textArea;
glb_viewPort = new JViewport();
glb_scrollZone = new ScrollZone();
glb_viewPort.add(glb_textArea);
glb_viewPort.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
glb_scrollZone.update(glb_scrollZone.getGraphics());
}
});
setLayout(new BorderLayout());
add(glb_viewPort,BorderLayout.CENTER);
add(glb_scrollZone,BorderLayout.EAST);
}
class ScrollZone extends JPanel {
public ScrollZone () {
setLayout(null);
glb_scrollBar = new ScrollBar();
setBackground(Color.BLACK);
add(glb_scrollBar);
}
public Dimension getPreferredSize() {
return new Dimension(glb_widthBar,1);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g2.setPaint(Defines.UIcolForeGDrawing);
g2.fillRect(0,0,glb_widthBar,glb_widthBar/2);
g2.fillRect(0,getHeight() - glb_widthBar / 2,glb_widthBar,glb_widthBar/2);
g2.setPaint(Defines.UIcolBackGDrawing);
g2.fillRoundRect(0,0,glb_widthBar,glb_widthBar,glb_widthBar,glb_widthBar);
g2.fillRoundRect(0,getHeight() - glb_widthBar,glb_widthBar,glb_widthBar,glb_widthBar,glb_widthBar);
float lcl_scrollZoneGetHeight = glb_scrollZone.getHeight();
float lcl_textAreaGetHeight = glb_textArea.getHeight();
float lcl_calc = (((lcl_scrollZoneGetHeight / lcl_textAreaGetHeight) * 100) * lcl_scrollZoneGetHeight) / 100;
glb_heightBar = (int)lcl_calc;
if (glb_heightBar < glb_widthBar) glb_heightBar = glb_widthBar;
if (glb_heightBar > glb_textArea.getHeight()) glb_heightBar = glb_textArea.getHeight();
if (glb_YMouse < 0) {
glb_scrollBar.setBounds(0,0,glb_widthBar,glb_heightBar);
}
else {
if (glb_YMouse > glb_scrollZone.getHeight() - glb_heightBar) {
glb_scrollBar.setBounds(0,glb_scrollZone.getHeight() - glb_heightBar,glb_widthBar,glb_heightBar);
}
else {
glb_scrollBar.setBounds(0,glb_YMouse,glb_widthBar,glb_heightBar);
}
}
}
}
class ScrollBar extends JComponent {
public ScrollBar () {
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent prm_evt) {
glb_YMousePressed = prm_evt.getY();
}
});
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent prm_evt) {
int lcl_xViewPort = 0;
int lcl_yViewPort = 0;
//glb_XMouse = getX() + prm_evt.getX() - glb_XMousePressed;
glb_YMouse = getY() + prm_evt.getY() - glb_YMousePressed;
if (glb_YMouse < 0) {
lcl_yViewPort = 0;
}
else {
if (glb_YMouse > glb_scrollZone.getHeight() - glb_heightBar) {
lcl_yViewPort = glb_textArea.getHeight() - glb_scrollZone.getHeight();
}
else {
float lcl_scrollZoneGetHeight = glb_scrollZone.getHeight();
float lcl_textAreaGetHeight = glb_textArea.getHeight();
float lcl_step = ((lcl_textAreaGetHeight - lcl_scrollZoneGetHeight) / (lcl_scrollZoneGetHeight - glb_heightBar)) * glb_YMouse;
lcl_yViewPort = (int)lcl_step;
}
}
glb_viewPort.setViewPosition(new Point(lcl_xViewPort,lcl_yViewPort));
setLocation(0,glb_YMouse);
}
});
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g2.setPaint(Defines.UIcolForeGDrawing);
g2.fillRoundRect(0,0,glb_widthBar,glb_heightBar,glb_widthBar,glb_widthBar);
}
}
}