📄 constraintshelper.java
字号:
/** * Copyright 2004 Carlos Silva A. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */package jgantt.view.gantt;import java.awt.Color;import java.awt.FontMetrics;import java.awt.Graphics;import java.awt.Point;import java.awt.event.ActionListener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseMotionListener;import java.text.MessageFormat;import javax.swing.BorderFactory;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPopupMenu;import jgantt.MenuBuilder;import jgantt.Messages;import jgantt.model.Constraint;import jgantt.model.Task;/** * ConstraintsHelper genera constraints cuando hay eventos de drag de mouse * * <p>$Date: 2005/05/05 08:25:50 $</p> * @version $Revision: 1.18 $ * @author {user} */class ConstraintsHelper implements MouseListener, MouseMotionListener { Point lastPressed = null; Point lastDragged = null; /** * Color para las lineas fantasma */ Color lineColor = Color.red; Task masterTask; Task slaveTask; /** * Etiqueta flotante con la descripcion del constraint que * se esta realizando. */ JLabel texto; private final Viewer viewer; /** * @param Viewer */ ConstraintsHelper(Viewer viewer) { this.viewer = viewer; texto = new JLabel(""); texto.setBackground(new Color(255, 255, 128)); texto.setOpaque(true); texto.setBorder(BorderFactory.createLineBorder(Color.gray)); viewer.setToolTipText("Constraint helper tip"); } /** * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent) */ public void mouseClicked(MouseEvent arg0) { } /** * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent) */ public void mouseEntered(MouseEvent arg0) { } /** * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent) */ public void mouseExited(MouseEvent arg0) { } /** * Retorna la tarea asociada a un punto en la pantalla * @param p * @return */ Task getTaskAt(Point p) { Object o = viewer.getElementAt(p); //System.out.println("ConstraintsHelper.getTaskAt("+p+"): "+o); if (o == null) return null; if (o instanceof Task) { return (Task) o; } return null; } /** * Retorna un numero y en el medio de la barra que representa la tarea bajo el y recibido. * @param y * @return */ int roundAtTask(int y) { return y - (y % viewer.viewOptions.taskHeight) + viewer.viewOptions.taskHeight / 2; } /** * Muestra la etiqueta en el punto p * @param label */ void showHint(String label, Point p) { texto.setLocation(p.x + 10, p.y + 10); texto.setText(label); FontMetrics fm = texto.getFontMetrics(texto.getFont()); texto.setSize(fm.stringWidth(texto.getText()) + 10, fm.getHeight()); if (texto.getParent() == null) { viewer.add(texto); texto.setVisible(true); } } /** * Muestra la etiqueta en el punto p * @param label */ void hideHint() { if (texto.getParent() != null) { texto.setVisible(false); viewer.remove(texto); viewer.repaint(); } } /** * Dibujar el constraint... * * @param g * @param p1 * @param p2 */ void drawLine(Graphics g, Point p1, Point p2) { g.setColor(lineColor); // Para llegar se requiere un camino. int xs[], ys[]; int b = 10; if (p2.x > p1.x + 2 * b) { int[] x = { p1.x, p1.x + b, p1.x + b, p2.x }; int[] y = { p1.y, p1.y, p2.y, p2.y }; xs = x; ys = y; } else { if (p2.y > p1.y) { int[] x = { p1.x, p1.x + b, p1.x + b, p2.x - b, p2.x - b, p2.x }; int[] y = { p1.y, p1.y, p1.y + b, p1.y + b, p2.y, p2.y }; xs = x; ys = y; } else { int[] x = { p1.x, p1.x + b, p1.x + b, p2.x - b, p2.x - b, p2.x }; int[] y = { p1.y, p1.y, p1.y - b, p1.y - b, p2.y, p2.y }; xs = x; ys = y; } } g.drawPolyline(xs, ys, xs.length); // repetir //for (int i=0;i<xs.length;i++){ // xs[i]++; // ys[i]++; //} //g.drawPolyline(xs, ys, xs.length); // punta de flecha int[] x = { p2.x - 5, p2.x - 1, p2.x - 6 }; int[] y = { p2.y - 4, p2.y, p2.y + 5 }; g.drawPolyline(x, y, x.length); } /** * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent) */ public void mousePressed(MouseEvent ev) { if ((ev.getModifiers() & MouseEvent.BUTTON3_MASK) != 0) { //popup menu... Object o = viewer.selectObjectAt(ev.getPoint()); JPopupMenu popup = null; ActionListener al = viewer.pvModel.getMainActionListener(); // Crea un menu de acuerdo al objeto que esta abajo if (o == null) { popup = MenuBuilder.buildPopup(al, "ctx.display"); } else if (o instanceof Task) { Task t = (Task) o; popup = MenuBuilder.buildPopup(al, "ctx.task"); } else if (o instanceof Constraint) { Constraint c = (Constraint) o; popup = MenuBuilder.buildPopup(al, "ctx.constraint"); } viewer.add(popup); popup.show(viewer, ev.getPoint().x, ev.getPoint().y); // TODO: Revisar como y cuando se remueve un popup del padre //viewer.remove(popup); } if ((ev.getModifiers() & MouseEvent.BUTTON1_MASK) == 0) return; lastPressed = ev.getPoint(); masterTask = getTaskAt(lastPressed); if (masterTask == null) { lastPressed = null; return; } lastPressed.x = (int) ((masterTask.getFinishDate().getTime() - viewer.viewOptions.t0) / viewer.viewOptions.msPixel); lastPressed.y = roundAtTask(lastPressed.y); lastDragged = null; showHint(Messages.getString("ConstraintsHelper.newHint"), ev.getPoint()); //$NON-NLS-1$ } /** * @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent) */ public void mouseDragged(MouseEvent ev) { // System.out.println("mouseDragged "+ev.getPoint()); if (lastPressed == null) return; Point p = ev.getPoint(); Task oldSlaveTask = slaveTask; slaveTask = getTaskAt(p); if (oldSlaveTask == slaveTask) return; if ((slaveTask == null) || (slaveTask == masterTask)) { hideHint(); return; } lastDragged = p; lastDragged.x = (int) ((slaveTask.getStartDate().getTime() - viewer.viewOptions.t0) / viewer.viewOptions.msPixel); lastDragged.y = roundAtTask(p.y); String tag = MessageFormat.format(Messages.getString("ConstraintsHelper.hint.format"), new Object[] { masterTask.getName(), slaveTask.getName()}); //$NON-NLS-1$ showHint(tag, ev.getPoint()); Graphics g = viewer.getGraphics(); viewer.update(g); drawLine(g, lastPressed, lastDragged); g.dispose(); } /** * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent) */ public void mouseReleased(MouseEvent ev) { if (lastPressed == null) return; hideHint(); slaveTask = getTaskAt(ev.getPoint()); lastPressed = null; lastDragged = null; if ((masterTask == slaveTask) || (masterTask == null) || (slaveTask == null)) return; //System.out.println("Nuevo constraint desde " + masterTask.getName() + " hacia " + slaveTask.getName()); //$NON-NLS-1$ try { new Constraint(masterTask, slaveTask); } catch (Exception e) { JOptionPane.showMessageDialog(viewer, e, Messages.getString("ConstraintsHelper.error.title"), //$NON-NLS-1$ JOptionPane.ERROR_MESSAGE); } } /** * @see java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent) */ public void mouseMoved(MouseEvent ev) { Object o = viewer.getElementAt(ev.getPoint()); if (o != null) { //System.out.println(" HOTSPOT "+o.toString()); if (o instanceof Task) { Task task = (Task) o; String notes = task.getNotes(); if (!"".equals(notes)) { StringBuffer sb = new StringBuffer(notes); for (int i = 0; i < sb.length(); i++) { if (sb.charAt(i) == '\n') { sb.insert(i + 1, "<br>"); } } sb.insert( 0, "<html><b>Task</b>: " + task.getName() + "<br><b>Notes</b>:<br>"); sb.append("</html>"); viewer.setToolTipText(sb.toString()); } } else { viewer.setToolTipText(null); } } else { viewer.setToolTipText(null); } } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -