📄 overviewpaneaction.java
字号:
package net.sourceforge.ganttproject.chart.overview;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.Graphics;import java.awt.event.ActionEvent;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.event.MouseMotionAdapter;import java.awt.image.RenderedImage;import java.util.Date;import java.util.List;import javax.swing.Action;import javax.swing.BorderFactory;import javax.swing.ImageIcon;import javax.swing.JLabel;import javax.swing.JPanel;import net.sourceforge.ganttproject.ChartComponentBase;import net.sourceforge.ganttproject.action.GPAction;import net.sourceforge.ganttproject.action.OkAction;import net.sourceforge.ganttproject.chart.BackgroundRendererImpl;import net.sourceforge.ganttproject.chart.Chart;import net.sourceforge.ganttproject.chart.ChartViewState;import net.sourceforge.ganttproject.gui.UIFacade;import net.sourceforge.ganttproject.gui.zoom.ZoomManager;import net.sourceforge.ganttproject.gui.zoom.ZoomManager.ZoomState;import net.sourceforge.ganttproject.task.TaskLength;import net.sourceforge.ganttproject.task.TaskManager;import net.sourceforge.ganttproject.time.TimeUnit;import net.sourceforge.ganttproject.time.TimeUnitFunctionOfDate;import net.sourceforge.ganttproject.time.TimeUnitStack;import net.sourceforge.ganttproject.time.gregorian.GPTimeUnitStack;public class OverviewPaneAction extends GPAction { private final UIFacade myUIFacade; private static final int OVERVIEW_PANE_WIDTH = 600; private static final int OVERVIEW_PANE_HEIGHT = 100; public OverviewPaneAction(UIFacade uiFacade) { super("overview"); myUIFacade = uiFacade; } @Override protected String getIconFilePrefix() { // TODO Auto-generated method stub return null; } public void actionPerformed(ActionEvent e) { final Chart activeChart = myUIFacade.getActiveChart(); Action okAction = new OkAction() { public void actionPerformed(ActionEvent e) { } }; //ChartComponentBase chartComponent = (ChartComponentBase) activeChart; final GPTimeUnitStack timeunitStack = (GPTimeUnitStack) activeChart.getProject().getTimeUnitStack(); final Chart copy = activeChart.createCopy(); final Date startDate = activeChart.getProject().getTaskManager().getProjectStart(); TaskLength projectLength = activeChart.getProject().getTaskManager().getProjectLength(); if (projectLength.getLength(timeunitStack.YEAR.createTimeUnit(startDate))<1) { projectLength = activeChart.getProject().getTaskManager().createLength(timeunitStack.YEAR.createTimeUnit(startDate), 1); } //ZoomState zoomState = findGoodZoomState(timeunitStack, projectLength, 600); TimeUnit bottomUnit = timeunitStack.MONTH.createTimeUnit(startDate);// if (bottomUnit instanceof TimeUnitFunctionOfDate) {// bottomUnit = ((TimeUnitFunctionOfDate)bottomUnit).createTimeUnit(startDate);// } //TimeUnit bottomUnit = timeunitStack.WEEK_AS_BOTTOM_UNIT; copy.setTopUnit(bottomUnit); copy.setBottomUnit(bottomUnit); copy.setStartDate(startDate); copy.setDimensions(OVERVIEW_PANE_HEIGHT, OVERVIEW_PANE_WIDTH); float projectLengthInDefaultUnits = projectLength.getLength(timeunitStack.getDefaultTimeUnit()); float bottomUnitLengthInDefaultUnits = bottomUnit.getAtomCount(timeunitStack.getDefaultTimeUnit()); copy.setBottomUnitWidth((int)(OVERVIEW_PANE_WIDTH/(projectLengthInDefaultUnits/bottomUnitLengthInDefaultUnits))); copy.resetRenderers(); final OverviewRendererImpl overviewRenderer = new OverviewRendererImpl(); BackgroundRendererImpl backgroundRenderer = new BackgroundRendererImpl(); backgroundRenderer.setHeight(OVERVIEW_PANE_HEIGHT); copy.addTimeUnitVisitor(backgroundRenderer); overviewRenderer.setHeight(OVERVIEW_PANE_HEIGHT); overviewRenderer.setStartDate(activeChart.getStartDate()); overviewRenderer.setEndDate(activeChart.getEndDate()); copy.addTimeUnitVisitor(overviewRenderer); JPanel overviewPanel = new JPanel(new BorderLayout()); final JPanel chartPanel = new JPanel(new BorderLayout()) { @Override public void paintComponent(Graphics g) { super.paintComponent(g); copy.paintChart(g); } }; chartPanel.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { super.mouseClicked(e); TaskManager taskManager = copy.getProject().getTaskManager(); TaskLength copyLength = copy.calculateLength(e.getX()); Date result = taskManager.shift(copy.getStartDate(), copyLength); activeChart.setStartDate(result); overviewRenderer.setStartDate(activeChart.getStartDate()); overviewRenderer.setEndDate(activeChart.getEndDate()); chartPanel.repaint(); } }); final JLabel dateLabel = new JLabel("Use arrow keys to scroll left/right or click the exact date"); chartPanel.addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseMoved(MouseEvent e) { TaskManager taskManager = copy.getProject().getTaskManager(); TaskLength copyLength = copy.calculateLength(e.getX()); Date currentDate = taskManager.shift(copy.getStartDate(), copyLength); dateLabel.setText(currentDate.toLocaleString()); } }); overviewPanel.setFocusable(true); overviewPanel.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { super.keyPressed(e); switch (e.getKeyCode()) { case KeyEvent.VK_LEFT: { activeChart.scrollRight(); overviewRenderer.setStartDate(activeChart.getStartDate()); overviewRenderer.setEndDate(activeChart.getEndDate()); chartPanel.repaint(); break; } case KeyEvent.VK_RIGHT: { activeChart.scrollLeft(); overviewRenderer.setStartDate(activeChart.getStartDate()); overviewRenderer.setEndDate(activeChart.getEndDate()); chartPanel.repaint(); break; } } } }); //chartPanel.setBorder(BorderFactory.createLineBorder(Color.GRAY, 3)); overviewPanel.add(dateLabel, BorderLayout.NORTH); overviewPanel.add(chartPanel, BorderLayout.CENTER); overviewPanel.setBorder(BorderFactory.createEtchedBorder()); overviewPanel.setPreferredSize(new Dimension(OVERVIEW_PANE_WIDTH, OVERVIEW_PANE_HEIGHT)); myUIFacade.showUndecoratedDialog(overviewPanel,new Action[] {okAction}); } private ZoomState findGoodZoomState(TimeUnitStack timeUnitStack, TaskLength projectLength, int chartWidth) { List<ZoomManager.ZoomState> zoomStates = ZoomManager.calculateZoomStates(timeUnitStack); for (ZoomState nextState : zoomStates) { float unitsCount = chartWidth/nextState.getBottomUnitWidth(); if (!projectLength.getTimeUnit().isConstructedFrom(nextState.getTimeUnitPair().getTopTimeUnit())) { continue; } if (projectLength.getLength(nextState.getTimeUnitPair().getTopTimeUnit())<unitsCount) { return nextState; } } return zoomStates.get(zoomStates.size()-1); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -