/*
GanttProject is an opensource project management tool.
Copyright (C) 2011 GanttProject Team
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 3
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package net.sourceforge.ganttproject;
import biz.ganttproject.core.calendar.GPCalendarListener;
import biz.ganttproject.core.option.FontOption;
import biz.ganttproject.core.option.GPOptionGroup;
import biz.ganttproject.core.option.IntegerOption;
import biz.ganttproject.core.time.TimeDuration;
import biz.ganttproject.core.time.TimeUnit;
import biz.ganttproject.core.time.TimeUnitStack;
import net.sourceforge.ganttproject.action.view.ViewChartOptionsDialogAction;
import net.sourceforge.ganttproject.chart.Chart;
import net.sourceforge.ganttproject.chart.ChartModel;
import net.sourceforge.ganttproject.chart.ChartModelBase;
import net.sourceforge.ganttproject.chart.ChartRendererBase;
import net.sourceforge.ganttproject.chart.ChartSelection;
import net.sourceforge.ganttproject.chart.ChartSelectionListener;
import net.sourceforge.ganttproject.chart.ChartUIConfiguration;
import net.sourceforge.ganttproject.chart.ChartViewState;
import net.sourceforge.ganttproject.chart.TimelineChart;
import net.sourceforge.ganttproject.chart.export.ChartImageVisitor;
import net.sourceforge.ganttproject.chart.mouse.MouseWheelListenerBase;
import net.sourceforge.ganttproject.gui.UIConfiguration;
import net.sourceforge.ganttproject.gui.UIFacade;
import net.sourceforge.ganttproject.gui.zoom.ZoomListener;
import net.sourceforge.ganttproject.gui.zoom.ZoomManager;
import net.sourceforge.ganttproject.task.TaskManager;
import org.eclipse.core.runtime.IStatus;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.RenderedImage;
import java.io.IOException;
import java.util.Date;
public abstract class ChartComponentBase extends JPanel implements TimelineChart {
public static final Cursor HAND_CURSOR = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
public static final Cursor DEFAULT_CURSOR;
public static final Cursor CURSOR_DRAG;
static {
Cursor drag = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
Cursor hand = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
try {
drag = Toolkit.getDefaultToolkit().createCustomCursor(
ImageIO.read(ChartComponentBase.class.getResource("/icons/16x16/chart-drag.png")),
new Point(16, 16), ChartComponentBase.class.getSimpleName() + "-drag");
hand = Toolkit.getDefaultToolkit().createCustomCursor(
ImageIO.read(ChartComponentBase.class.getResource("/icons/16x16/chart-hand.png")),
new Point(16, 16), ChartComponentBase.class.getSimpleName() + "-hand");
} catch (HeadlessException e) {
GPLogger.logToLogger(e);
} catch (IndexOutOfBoundsException e) {
GPLogger.logToLogger(e);
} catch (IOException e) {
GPLogger.logToLogger(e);
}
CURSOR_DRAG = drag;
DEFAULT_CURSOR = hand;
}
private final IGanttProject myProject;
private final ZoomManager myZoomManager;
private MouseWheelListenerBase myMouseWheelListener;
private final UIFacade myUIFacade;
private final ViewChartOptionsDialogAction myOptionsDialogAction;
public ChartComponentBase(IGanttProject project, UIFacade uiFacade, ZoomManager zoomManager) {
myProject = project;
myUIFacade = uiFacade;
myZoomManager = zoomManager;
myOptionsDialogAction = new ViewChartOptionsDialogAction(this, uiFacade);
myMouseWheelListener = new MouseWheelListenerBase(zoomManager);
myProject.getActiveCalendar().addListener(new GPCalendarListener() {
@Override
public void onCalendarChange() {
getChartModel().resetOffsets();
reset();
}
});
}
@Override
public void init(IGanttProject project, IntegerOption dpiOption, FontOption chartFontOption) {
// Skip as we already have a project instance.
}
protected void initMouseListeners() {
addMouseListener(getMouseListener());
addMouseMotionListener(getMouseMotionListener());
addMouseWheelListener(myMouseWheelListener);
}
@Override
public Object getAdapter(Class adapter) {
if (Component.class.isAssignableFrom(adapter)) {
return this;
}
return null;
}
public abstract ChartViewState getViewState();
public ZoomListener getZoomListener() {
return getImplementation();
}
public ZoomManager getZoomManager() {
return myZoomManager;
}
@Override
public GPOptionGroup[] getOptionGroups() {
return getChartModel().getChartOptionGroups();
}
@Override
public Chart createCopy() {
return new AbstractChartImplementation(myProject, getUIFacade(), getChartModel().createCopy(), this);
}
@Override
public ChartSelection getSelection() {
return getImplementation().getSelection();
}
@Override
public IStatus canPaste(ChartSelection selection) {
return getImplementation().canPaste(selection);
}
@Override
public void paste(ChartSelection selection) {
getImplementation().paste(selection);
}
@Override
public void addSelectionListener(ChartSelectionListener listener) {
getImplementation().addSelectionListener(listener);
}
@Override
public void removeSelectionListener(ChartSelectionListener listener) {
getImplementation().removeSelectionListener(listener);
}
protected abstract GPTreeTableBase getTreeTable();
protected UIFacade getUIFacade() {
return myUIFacade;
}
protected TaskManager getTaskManager() {
return myProject.getTaskManager();
}
protected TimeUnitStack getTimeUnitStack() {
return myProject.getTimeUnitStack();
}
protected UIConfiguration getUIConfiguration() {
return myProject.getUIConfiguration();
}
public void setDefaultCursor() {
setCursor(DEFAULT_CURSOR);
}
public Action getOptionsDialogAction() {
return myOptionsDialogAction;
}
@Override
public ChartModel getModel() {
return getChartModel();
}
@Override
public ChartUIConfiguration getStyle() {
return getChartModel().getChartUIConfiguration();
}
protected abstract ChartModelBase getChartModel();
protected abstract MouseListener getMouseListener();
protected abstract MouseMotionListener getMouseMotionListener();
// protected abstract MouseWheelListener getMouseWheelListener();
protected abstract AbstractChartImplementation getImplementation();
@Override
public Date getStartDate() {
return getImplementation().getStartDate();
}
@Override
public void setStartDate(Date startDate) {
getImplementation().setStartDate(startDate);
repaint();
}
@Override
public IGanttProject getProject() {
return myProject;
}
@Override
public Date getEndDate() {
return getImplementation().getEndDate();
}
@Override
public void setVScrollController(VScrollController vscrollController) {
getImplementation().setVScrollController(vscrollController);
}
@Override
public void scrollBy(TimeDuration duration) {
getImplementation().scrollBy(duration);
repaint();
}
@Override
public void setStartOffset(int pixels) {
getImplementation().setStartOffset(pixels);
repaint();
}
@Override
public void setDimensions(int height, int width) {
getImplementation().setDimensions(height, width);
}
@Override
public void setBottomUnit(TimeUnit bottomUnit) {
getImplementation().setBottomUnit(bottomUnit);
}
@Override
public void setTopUnit(TimeUnit topUnit) {
getImplementation().setTopUnit(topUnit);
}
@Override
public void setBottomUnitWidth(int width) {
getImplementation().setBottomUnitWidth(width);
}
// public void paintChart(Graphics g) {
// getImplementation().paintChart(g);
// }
@Override
public void addRenderer(ChartRendererBase renderer) {
getImplementation().addRenderer(renderer);
}
@Override
public void resetRenderers() {
getImplementation().resetRenderers();
}
/** draw the panel */
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
getChartModel().setBounds(getSize());
getImplementation().paintChart(g);
}
@Override
public void buildImage(GanttExportSettings settings, ChartImageVisitor imageVisitor) {
getImplementation().buildImage(settings, imageVisitor);
}
@Override
public RenderedImage getRenderedImage(GanttExportSettings settings) {
return getImplementation().getRenderedImage(settings);
}
@Override
public void reset() {
repaint();
}
public Action[] getPopupMenuActions(MouseEvent e) {
return new Action[0];
}
JComponent getJComponent() {
return new JLayer<>(this, getImplementation().createMouseHoverLayer());
}
@Override
public void setTimelineHeight(int height) {
getImplementation().setTimelineHeight(height);
}
}