package nbtool.gui.logviews.images; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import nbtool.util.Utility; class ZoomImageDisplay extends JPanel { private static final long serialVersionUID = 1L; public ZoomImageDisplay() { full = part = null; sub_rect = null; setLayout(null); slider = new JSlider(JSlider.HORIZONTAL); add(slider); slider.setVisible(false); slider.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e) { //U.w("slider change"); recalcPart(null); } }); addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { //U.w("click"); if (full != null && e.getX() < full.getWidth() && e.getY() < full.getHeight()) { //U.w("\tinside"); recalcPart(e.getPoint()); } } }); } public void useImage(BufferedImage img) { full = part = img; sub_rect = new Rectangle(0, 0, img.getWidth(), img.getHeight()); slider.setMaximum(img.getWidth()); slider.setMinimum(1); slider.setValue(slider.getMaximum()); slider.setVisible(true); this.repaint(); } private void recalcPart(Point click) { if (full == null) return; int max_width = full.getWidth(); int max_height = full.getHeight(); int req_width = slider.getValue(); int req_height = (max_height * req_width) / max_width; //For now, we prioritize dimensions and adjust point to fit. int req_x, req_y; if (click != null) { req_x = click.x; req_y = click.y; } else { req_x = sub_rect.x; req_y = sub_rect.y; } if (req_x + req_width > max_width) req_x = max_width - req_width; if (req_y + req_height > max_height) req_y = max_height - req_height; if (req_width <= 0) req_width = 1; if (req_height <= 0) req_height = 1; sub_rect = new Rectangle(req_x, req_y, req_width, req_height); part = full.getSubimage(sub_rect.x, sub_rect.y, sub_rect.width, sub_rect.height); this.repaint(); } protected void paintComponent(Graphics g) { super.paintComponent(g); if (full == null) return; int y_offset = 0; g.drawImage(full, 0, 0, null); y_offset += full.getHeight() + 10; Dimension d = slider.getPreferredSize(); slider.setBounds(0, y_offset, d.width, d.height); y_offset += d.height + 10; g.setColor(Color.PINK); g.drawRect(sub_rect.x, sub_rect.y, sub_rect.width, sub_rect.height); g.drawImage(part, 0, y_offset, full.getWidth(), full.getHeight(), null); y_offset += full.getHeight(); this.setPreferredSize(new Dimension(full.getWidth(), y_offset)); } private BufferedImage full, part; private Rectangle sub_rect; //Width, from 1 to full.getWidth() private JSlider slider; }