📄 ganttgraphicarea.java
字号:
/*************************************************************************** GanttGraphicArea.java - description ------------------- begin : dec 2002 copyright : (C) 2002 by Thomas Alexandre email : alexthomas(at)ganttproject.org ***************************************************************************//*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/package net.sourceforge.ganttproject;import java.awt.Color;import java.awt.Component;import java.awt.Cursor;import java.awt.Dimension;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Image;import java.awt.Point;import java.awt.Rectangle;import java.awt.Toolkit;import java.awt.datatransfer.DataFlavor;import java.awt.event.ActionEvent;import java.awt.event.InputEvent;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseMotionListener;import java.awt.image.BufferedImage;import java.awt.image.ComponentColorModel;import java.awt.image.DataBuffer;import java.awt.image.DataBufferByte;import java.awt.image.DataBufferInt;import java.awt.image.RenderedImage;import java.awt.image.WritableRaster;import java.net.URL;import java.util.ArrayList;import java.util.Arrays;import java.util.Date;import java.util.Hashtable;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Vector;import javax.swing.Action;import javax.swing.Icon;import javax.swing.JPanel;import javax.swing.table.JTableHeader;import org.eclipse.core.runtime.IStatus;import org.eclipse.core.runtime.Status;import net.sourceforge.ganttproject.action.GPAction;import net.sourceforge.ganttproject.calendar.GPCalendar;import net.sourceforge.ganttproject.chart.ChartModel;import net.sourceforge.ganttproject.chart.ChartModelBase;import net.sourceforge.ganttproject.chart.ChartModelImpl;import net.sourceforge.ganttproject.chart.ChartSelection;import net.sourceforge.ganttproject.chart.ChartViewState;import net.sourceforge.ganttproject.chart.DependencyInteractionRenderer;import net.sourceforge.ganttproject.chart.GanttChart;import net.sourceforge.ganttproject.chart.PublicHolidayDialogAction;import net.sourceforge.ganttproject.chart.RenderedChartImage;import net.sourceforge.ganttproject.chart.RenderedGanttChartImage;import net.sourceforge.ganttproject.chart.TaskInteractionHintRenderer;import net.sourceforge.ganttproject.chart.VisibleNodesFilter;import net.sourceforge.ganttproject.chart.item.ChartItem;import net.sourceforge.ganttproject.chart.item.TaskBoundaryChartItem;import net.sourceforge.ganttproject.chart.item.TaskProgressChartItem;import net.sourceforge.ganttproject.chart.item.TaskRegularAreaChartItem;import net.sourceforge.ganttproject.font.Fonts;import net.sourceforge.ganttproject.gui.UIConfiguration;import net.sourceforge.ganttproject.gui.UIFacade;import net.sourceforge.ganttproject.gui.options.model.ChangeValueDispatcher;import net.sourceforge.ganttproject.gui.options.model.ChangeValueEvent;import net.sourceforge.ganttproject.gui.options.model.ChangeValueListener;import net.sourceforge.ganttproject.gui.options.model.GPOptionChangeListener;import net.sourceforge.ganttproject.gui.scrolling.ScrollingManager;import net.sourceforge.ganttproject.gui.zoom.ZoomListener;import net.sourceforge.ganttproject.gui.zoom.ZoomManager;import net.sourceforge.ganttproject.language.GanttLanguage;import net.sourceforge.ganttproject.task.CustomColumEvent;import net.sourceforge.ganttproject.task.CustomColumsListener;import net.sourceforge.ganttproject.task.Task;import net.sourceforge.ganttproject.task.TaskImpl;import net.sourceforge.ganttproject.task.TaskLength;import net.sourceforge.ganttproject.task.TaskManager;import net.sourceforge.ganttproject.task.TaskMutator;import net.sourceforge.ganttproject.task.TaskSelectionManager;import net.sourceforge.ganttproject.task.algorithm.RecalculateTaskScheduleAlgorithm;import net.sourceforge.ganttproject.task.dependency.TaskDependencyException;import net.sourceforge.ganttproject.task.dependency.constraint.FinishStartConstraintImpl;import net.sourceforge.ganttproject.task.event.TaskDependencyEvent;import net.sourceforge.ganttproject.task.event.TaskListenerAdapter;import net.sourceforge.ganttproject.task.event.TaskScheduleEvent;import net.sourceforge.ganttproject.time.TimeUnit;import net.sourceforge.ganttproject.time.gregorian.GregorianCalendar;import net.sourceforge.ganttproject.undo.GPUndoManager;import javax.swing.*;import org.jdesktop.swing.*;/** * Class for the graphic part of the soft */public class GanttGraphicArea extends ChartComponentBase implements GanttChart, CustomColumsListener, ProjectEventListener { static { Toolkit toolkit = Toolkit.getDefaultToolkit(); URL cursorResource = GanttGraphicArea.class.getClassLoader() .getResource("icons/cursorpercent.gif"); Image image = toolkit.getImage(cursorResource); CHANGE_PROGRESS_CURSOR = toolkit.createCustomCursor(image, new Point( 10, 5), "CursorPercent"); } private static final Cursor W_RESIZE_CURSOR = new Cursor( Cursor.W_RESIZE_CURSOR); private static final Cursor E_RESIZE_CURSOR = new Cursor( Cursor.E_RESIZE_CURSOR); private static final Cursor CHANGE_PROGRESS_CURSOR; private static final int HEADER_OFFSET = 44; /** Begin of display. */// public GanttCalendar date; /** Reference to the GanttTree */ public GanttTree2 tree; /** Default color for tasks */ public static Color taskDefaultColor // = new Color( (float) 0.549, (float) 0.713, (float) 0.807); = new Color(140, 182, 206); /** This value is connected to the GanttTRee Scrollbar to move up or down */ private int margY; /* ! The main application */ GanttProject appli; private UIConfiguration myUIConfiguration; private Color myProjectLevelTaskColor; private final ChartModelImpl myChartModel; private final TaskManager myTaskManager; private GPUndoManager myUndoManager; private JTableHeader myTableHeader = null; private MouseEvent myLastMouseEvent = null; //private List myItemsToConsider; private JPanel myPreviewPanel = new ChartOptionsPreviewPanel(); private TaskTreeImageGenerator myTaskImageGenerator; private ChartViewState myViewState; /** Constructor */ public GanttGraphicArea(GanttProject app, GanttTree2 ttree, TaskManager taskManager, ZoomManager zoomManager, GPUndoManager undoManager) { super(app.getProject(), app.getUIFacade(), zoomManager); this.setBackground(Color.WHITE); myTaskManager = taskManager; myUndoManager = undoManager; // myChartModel = new ChartModelImpl(getTaskManager(), app .getTimeUnitStack(), app.getUIConfiguration()); myChartModel.addOptionChangeListener(new GPOptionChangeListener() { public void optionsChanged() { repaint(); } }); myViewState = new ChartViewState(this, app.getUIFacade()); super.setStartDate(GregorianCalendar.getInstance().getTime()); myTaskManager.addTaskListener(new TaskListenerAdapter() { public void taskScheduleChanged(TaskScheduleEvent e) { adjustDependencies((Task) e.getSource()); } public void dependencyAdded(TaskDependencyEvent e) { adjustDependencies(e.getDependency().getDependee()); repaint(); } public void dependencyRemoved(TaskDependencyEvent e) { repaint(); } private void adjustDependencies(Task task) { RecalculateTaskScheduleAlgorithm alg = myTaskManager .getAlgorithmCollection() .getRecalculateTaskScheduleAlgorithm(); if (!alg.isRunning()) { try { alg.run(task); } catch (TaskDependencyException e1) { e1.printStackTrace(); // To change body of catch // statement use File | Settings // | File Templates. } // appli.setQuickSave (true); } } });// date = new GanttCalendar();//// date.setDay(1); this.tree = ttree; margY = 0; appli = app; // creation of the different color use to paint // arrayColor[0] = new Color((float)0.905,(float)0.905,(float)0.905); myTableHeader = tree.getTreeTable().getTable().getTableHeader(); Mediator.getCustomColumnsManager().addCustomColumnsListener(this); myTaskImageGenerator = new TaskTreeImageGenerator(ttree, app.getUIConfiguration()); } /** Return the color of the task */ public Color getTaskColor() { return myProjectLevelTaskColor == null ? myUIConfiguration .getTaskColor() : myProjectLevelTaskColor; } /** Change the color of the task */ public void setProjectLevelTaskColor(Color c) { myProjectLevelTaskColor = c; } /** The size of the panel. */ public Dimension getPreferredSize() { return new Dimension(465, 600); } public ChartModelImpl getMyChartModel() { return myChartModel; } public void drawGPVersion(Graphics g) { g.setColor(Color.black); g.setFont(Fonts.GP_VERSION_FONT); g.drawString("GanttProject (" + GanttProject.version + ")", 3, getHeight() + 18); } /** Change the velue connected to the JTree's Scrollbar */ public void setScrollBar(int v) { margY = v; } /** Return the value of the JTree's Scrollbar */ public int getScrollBar() { return margY; } public String getName() { return GanttLanguage.getInstance().getText("gantt"); } /** Return an image with the gantt chart */ // TODO: 1.11 take into account flags "render this and don't render that" public BufferedImage getChart(GanttExportSettings settings) { RenderedChartImage renderedImage = (RenderedChartImage) getRenderedImage(settings); BufferedImage result = renderedImage.getWholeImage(); repaint(); return result; } public RenderedImage getRenderedImage(GanttExportSettings settings) { GanttTreeTable treetable = Mediator.getGanttProjectSingleton().getTree().getTreeTable(); JXTreeTable xtreetable = treetable.getTreeTable(); // I don't know why we need to add 67 to the height to make it fit the real height int tree_height = xtreetable.getHeight()+67; GanttImagePanel logo_panel= new GanttImagePanel("big.png", 1024, 44); BufferedImage tree = new BufferedImage(xtreetable.getWidth(), tree_height, BufferedImage.TYPE_INT_RGB); BufferedImage treeview = new BufferedImage(treetable.getWidth(), treetable.getHeight(), BufferedImage.TYPE_INT_RGB); BufferedImage logo = new BufferedImage(xtreetable.getWidth(), 44, BufferedImage.TYPE_INT_RGB); Graphics2D glogo = logo.createGraphics(); logo_panel.paintComponent(glogo); Graphics2D gtreeview = treeview.createGraphics(); treetable.paintComponents(gtreeview); BufferedImage header = treeview.getSubimage(0, 0, treeview.getWidth(), treetable.getRowHeight()+3); treeview.flush(); Graphics2D gtree = tree.createGraphics(); xtreetable.printAll(gtree); //create a new image that will contain the logo, the table/tree and the chart BufferedImage task_image = new BufferedImage(xtreetable.getWidth(), tree_height+logo_panel.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D gimage = task_image.createGraphics(); //draw the logo on the image gimage.drawImage(logo, 0, 0, tree.getWidth(), logo.getHeight(), Color.WHITE, null); //draw the header on the image gimage.drawImage(header, 0, logo.getHeight(), header.getWidth(), header.getHeight(), null); //draw the tree on the image gimage.drawImage(tree, 0, logo.getHeight()+header.getHeight(), tree.getWidth(), tree.getHeight(), null); Date dateStart = null; Date dateEnd = null; TimeUnit unit = getViewState().getBottomTimeUnit(); dateStart = settings.getStartDate() == null ? getStartDate() : settings.getStartDate(); dateEnd = settings.getEndDate() == null ? getEndDate() : settings.getEndDate(); if (dateStart.after(dateEnd)) { Date tmp = (Date) dateStart.clone(); dateStart = (Date) dateEnd.clone(); dateEnd = tmp; } TaskLength printedLength = getTaskManager().createLength(unit, dateStart, dateEnd); int chartWidth = (int) ((printedLength.getLength(getViewState().getBottomTimeUnit()) + 1) * getViewState().getBottomUnitWidth()); if (chartWidth<this.getWidth()) { chartWidth = this.getWidth(); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -