/* * Copyright 2013 Red Hat, Inc. and/or its affiliates. * * 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 org.optaplanner.examples.common.swingui.timetable; import java.awt.Dimension; import java.awt.Rectangle; import java.util.HashMap; import java.util.Map; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JViewport; import javax.swing.Scrollable; import org.optaplanner.examples.common.swingui.SolutionPanel; public class TimeTablePanel<XObject, YObject> extends JPanel implements Scrollable { private TimeTableLayout layout = new TimeTableLayout(); private Map<Object, Integer> xMap = new HashMap<>(); private Map<Object, Integer> yMap = new HashMap<>(); public TimeTablePanel() { setLayout(layout); } public void reset() { removeAll(); layout.reset(); xMap.clear(); yMap.clear(); } // ************************************************************************ // Define methods // ************************************************************************ public void defineColumnHeaderByKey(HeaderColumnKey xObject) { int x = layout.addColumn(); xMap.put(xObject, x); } public void defineColumnHeader(XObject xObject) { int x = layout.addColumn(); xMap.put(xObject, x); } public void defineColumnHeader(XObject xObject, int width) { int x = layout.addColumn(width); xMap.put(xObject, x); } public void defineRowHeaderByKey(HeaderRowKey yObject) { int y = layout.addRow(); yMap.put(yObject, y); } public void defineRowHeader(YObject yObject) { int y = layout.addRow(); yMap.put(yObject, y); } public void defineRowHeader(YObject yObject, int height) { int y = layout.addRow(height); yMap.put(yObject, y); } // ************************************************************************ // Add methods // ************************************************************************ public void addCornerHeader(HeaderColumnKey xObject, HeaderRowKey yObject, JComponent component) { int x = xMap.get(xObject); int y = yMap.get(yObject); add(component, new TimeTableLayoutConstraints(x, y, true)); } public void addColumnHeader(XObject xObject, HeaderRowKey yObject, JComponent component) { int x = xMap.get(xObject); int y = yMap.get(yObject); add(component, new TimeTableLayoutConstraints(x, y, true)); } public void addColumnHeader(XObject xObject1, HeaderRowKey yObject1, XObject xObject2, HeaderRowKey yObject2, JComponent component) { int x1 = xMap.get(xObject1); int y1 = yMap.get(yObject1); int x2 = xMap.get(xObject2); int y2 = yMap.get(yObject2); add(component, new TimeTableLayoutConstraints(x1, y1, x2 - x1 + 1, y2 - y1 + 1, true)); } public void addRowHeader(HeaderColumnKey xObject, YObject yObject, JComponent component) { int x = xMap.get(xObject); int y = yMap.get(yObject); add(component, new TimeTableLayoutConstraints(x, y, true)); } public void addRowHeader(HeaderColumnKey xObject1, YObject yObject1, HeaderColumnKey xObject2, YObject yObject2, JComponent component) { int x1 = xMap.get(xObject1); int y1 = yMap.get(yObject1); int x2 = xMap.get(xObject2); int y2 = yMap.get(yObject2); add(component, new TimeTableLayoutConstraints(x1, y1, x2 - x1 + 1, y2 - y1 + 1, true)); } public void addCell(XObject xObject, YObject yObject, JComponent component) { int x = xMap.get(xObject); int y = yMap.get(yObject); add(component, new TimeTableLayoutConstraints(x, y)); } public void addCell(XObject xObject1, YObject yObject1, XObject xObject2, YObject yObject2, JComponent component) { int x1 = xMap.get(xObject1); int y1 = yMap.get(yObject1); int x2 = xMap.get(xObject2); int y2 = yMap.get(yObject2); add(component, new TimeTableLayoutConstraints(x1, y1, x2 - x1 + 1, y2 - y1 + 1)); } // ************************************************************************ // Scrollable methods // ************************************************************************ @Override public Dimension getPreferredScrollableViewportSize() { return SolutionPanel.PREFERRED_SCROLLABLE_VIEWPORT_SIZE; } @Override public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { return 20; } @Override public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { return 20; } @Override public boolean getScrollableTracksViewportWidth() { if (getParent() instanceof JViewport) { return (((JViewport) getParent()).getWidth() > getPreferredSize().width); } return false; } @Override public boolean getScrollableTracksViewportHeight() { if (getParent() instanceof JViewport) { return (((JViewport) getParent()).getHeight() > getPreferredSize().height); } return false; } public enum HeaderColumnKey { HEADER_COLUMN_GROUP2, HEADER_COLUMN_GROUP1, HEADER_COLUMN, HEADER_COLUMN_EXTRA_PROPERTY_1, HEADER_COLUMN_EXTRA_PROPERTY_2, HEADER_COLUMN_EXTRA_PROPERTY_3, HEADER_COLUMN_EXTRA_PROPERTY_4, HEADER_COLUMN_EXTRA_PROPERTY_5, TRAILING_HEADER_COLUMN; } public enum HeaderRowKey { HEADER_ROW_GROUP2, HEADER_ROW_GROUP1, HEADER_ROW, TRAILING_HEADER_ROW; } }