/* * Copyright 2010 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.app; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.GroupLayout; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.border.TitledBorder; import org.optaplanner.examples.cheaptime.app.CheapTimeApp; import org.optaplanner.examples.cloudbalancing.app.CloudBalancingApp; import org.optaplanner.examples.common.app.CommonApp; import org.optaplanner.examples.common.persistence.AbstractSolutionDao; import org.optaplanner.examples.common.swingui.OpenBrowserAction; import org.optaplanner.examples.common.swingui.SolverAndPersistenceFrame; import org.optaplanner.examples.curriculumcourse.app.CurriculumCourseApp; import org.optaplanner.examples.dinnerparty.app.DinnerPartyApp; import org.optaplanner.examples.examination.app.ExaminationApp; import org.optaplanner.examples.investment.app.InvestmentApp; import org.optaplanner.examples.machinereassignment.app.MachineReassignmentApp; import org.optaplanner.examples.meetingscheduling.app.MeetingSchedulingApp; import org.optaplanner.examples.nqueens.app.NQueensApp; import org.optaplanner.examples.nurserostering.app.NurseRosteringApp; import org.optaplanner.examples.pas.app.PatientAdmissionScheduleApp; import org.optaplanner.examples.projectjobscheduling.app.ProjectJobSchedulingApp; import org.optaplanner.examples.taskassigning.app.TaskAssigningApp; import org.optaplanner.examples.tennis.app.TennisApp; import org.optaplanner.examples.travelingtournament.app.TravelingTournamentApp; import org.optaplanner.examples.tsp.app.TspApp; import org.optaplanner.examples.vehiclerouting.app.VehicleRoutingApp; import org.optaplanner.swing.impl.TangoColorFactory; public class OptaPlannerExamplesApp extends JFrame { /** * Supported system properties: {@link AbstractSolutionDao#DATA_DIR_SYSTEM_PROPERTY}. * @param args never null */ public static void main(String[] args) { CommonApp.prepareSwingEnvironment(); OptaPlannerExamplesApp optaPlannerExamplesApp = new OptaPlannerExamplesApp(); optaPlannerExamplesApp.pack(); optaPlannerExamplesApp.setLocationRelativeTo(null); optaPlannerExamplesApp.setVisible(true); } private static String determineOptaPlannerExamplesVersion() { String optaPlannerExamplesVersion = OptaPlannerExamplesApp.class.getPackage().getImplementationVersion(); if (optaPlannerExamplesVersion == null) { optaPlannerExamplesVersion = ""; } return optaPlannerExamplesVersion; } private JTextArea descriptionTextArea; private WebExamplesDialog webExamplesDialog; public OptaPlannerExamplesApp() { super("OptaPlanner examples " + determineOptaPlannerExamplesVersion()); setIconImage(SolverAndPersistenceFrame.OPTA_PLANNER_ICON.getImage()); setContentPane(createContentPane()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private Container createContentPane() { JPanel contentPane = new JPanel(new BorderLayout(5, 5)); contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); JLabel titleLabel = new JLabel("Which example do you want to see?", JLabel.CENTER); titleLabel.setFont(titleLabel.getFont().deriveFont(20.0f)); contentPane.add(titleLabel, BorderLayout.NORTH); JScrollPane examplesScrollPane = new JScrollPane(createExamplesPanel()); examplesScrollPane.getHorizontalScrollBar().setUnitIncrement(20); examplesScrollPane.getVerticalScrollBar().setUnitIncrement(20); contentPane.add(examplesScrollPane, BorderLayout.CENTER); JPanel bottomPanel = new JPanel(new BorderLayout(5, 5)); bottomPanel.add(createDescriptionPanel(), BorderLayout.CENTER); bottomPanel.add(createExtraPanel(), BorderLayout.EAST); contentPane.add(bottomPanel, BorderLayout.SOUTH); return contentPane; } private JPanel createExamplesPanel() { JPanel examplesPanel = new JPanel(); examplesPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); GroupLayout layout = new GroupLayout(examplesPanel); examplesPanel.setLayout(layout); JPanel basicExamplesPanel = createBasicExamplesPanel(); JPanel realExamplesPanel = createRealExamplesPanel(); JPanel difficultExamplesPanel = createDifficultExamplesPanel(); layout.setHorizontalGroup(layout.createSequentialGroup() .addComponent(basicExamplesPanel) .addGap(10) .addComponent(realExamplesPanel) .addGap(10) .addComponent(difficultExamplesPanel)); layout.setVerticalGroup(layout.createParallelGroup() .addComponent(basicExamplesPanel) .addComponent(realExamplesPanel) .addComponent(difficultExamplesPanel)); return examplesPanel; } private JPanel createBasicExamplesPanel() { JPanel panel = new JPanel(new GridLayout(0, 1, 5, 5)); TitledBorder titledBorder = BorderFactory.createTitledBorder("Basic examples"); titledBorder.setTitleColor(TangoColorFactory.CHAMELEON_3); panel.setBorder(BorderFactory.createCompoundBorder(titledBorder, BorderFactory.createEmptyBorder(5, 5, 5, 5))); panel.add(createExampleButton(new NQueensApp())); panel.add(createExampleButton(new CloudBalancingApp())); panel.add(createExampleButton(new TspApp())); panel.add(createExampleButton(new DinnerPartyApp())); panel.add(createExampleButton(new TennisApp())); panel.add(createExampleButton(new MeetingSchedulingApp())); return panel; } private JPanel createRealExamplesPanel() { JPanel panel = new JPanel(new GridLayout(0, 1, 5, 5)); TitledBorder titledBorder = BorderFactory.createTitledBorder("Real examples"); titledBorder.setTitleColor(TangoColorFactory.BUTTER_3); panel.setBorder(BorderFactory.createCompoundBorder(titledBorder, BorderFactory.createEmptyBorder(5, 5, 5, 5))); panel.add(createExampleButton(new CurriculumCourseApp())); panel.add(createExampleButton(new MachineReassignmentApp())); panel.add(createExampleButton(new VehicleRoutingApp())); panel.add(createExampleButton(new ProjectJobSchedulingApp())); panel.add(createExampleButton(new PatientAdmissionScheduleApp())); panel.add(createExampleButton(new TaskAssigningApp())); return panel; } private JPanel createDifficultExamplesPanel() { JPanel panel = new JPanel(new GridLayout(0, 1, 5, 5)); TitledBorder titledBorder = BorderFactory.createTitledBorder("Difficult examples"); titledBorder.setTitleColor(TangoColorFactory.SCARLET_3); panel.setBorder(BorderFactory.createCompoundBorder(titledBorder, BorderFactory.createEmptyBorder(5, 5, 5, 5))); panel.add(createExampleButton(new ExaminationApp())); panel.add(createExampleButton(new NurseRosteringApp())); panel.add(createExampleButton(new TravelingTournamentApp())); panel.add(createExampleButton(new CheapTimeApp())); panel.add(createExampleButton(new InvestmentApp())); return panel; } private JButton createExampleButton(final CommonApp commonApp) { String iconResource = commonApp.getIconResource(); Icon icon = iconResource == null ? new EmptyIcon() : new ImageIcon(getClass().getResource(iconResource)); JButton button = new JButton(new AbstractAction(commonApp.getName(), icon) { @Override public void actionPerformed(ActionEvent e) { commonApp.init(OptaPlannerExamplesApp.this, false); } }); button.setHorizontalAlignment(JButton.LEFT); button.setHorizontalTextPosition(JButton.RIGHT); button.setVerticalTextPosition(JButton.CENTER); button.addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { descriptionTextArea.setText(commonApp.getDescription()); } @Override public void mouseExited(MouseEvent e) { descriptionTextArea.setText(""); } }); return button; } private JButton createDisabledExampleButton(final CommonApp commonApp) { JButton exampleButton = createExampleButton(commonApp); exampleButton.setEnabled(false); return exampleButton; } private JPanel createDescriptionPanel() { JPanel descriptionPanel = new JPanel(new BorderLayout(2, 2)); descriptionPanel.add(new JLabel("Description"), BorderLayout.NORTH); descriptionTextArea = new JTextArea(8, 65); descriptionTextArea.setEditable(false); descriptionTextArea.setLineWrap(true); descriptionTextArea.setWrapStyleWord(true); descriptionPanel.add(new JScrollPane(descriptionTextArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), BorderLayout.CENTER); return descriptionPanel; } private JPanel createExtraPanel() { JPanel extraPanel = new JPanel(new GridLayout(0, 1, 5, 5)); extraPanel.add(new JPanel()); webExamplesDialog = new WebExamplesDialog(); Action webExamplesAction = new AbstractAction("Show web examples") { @Override public void actionPerformed(ActionEvent event) { webExamplesDialog.setLocationRelativeTo(OptaPlannerExamplesApp.this); webExamplesDialog.setVisible(true); } }; extraPanel.add(new JButton(webExamplesAction)); Action homepageAction = new OpenBrowserAction("www.optaplanner.org", "https://www.optaplanner.org"); extraPanel.add(new JButton(homepageAction)); Action documentationAction = new OpenBrowserAction("Documentation", "https://www.optaplanner.org/learn/documentation.html"); extraPanel.add(new JButton(documentationAction)); return extraPanel; } private static class EmptyIcon implements Icon { @Override public int getIconWidth() { return 64; } @Override public int getIconHeight() { return 64; } @Override public void paintIcon(Component c, Graphics g, int x, int y) { // Do nothing } } private class WebExamplesDialog extends JDialog { private WebExamplesDialog() { super(OptaPlannerExamplesApp.this, "Web examples", true); JPanel contentPanel = new JPanel(new BorderLayout(5, 5)); contentPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); contentPanel.add(createMiddlePanel(), BorderLayout.CENTER); JPanel buttonPanel = new JPanel(new FlowLayout()); Action okAction = new AbstractAction("OK") { @Override public void actionPerformed(ActionEvent e) { setVisible(false); } }; buttonPanel.add(new JButton(okAction)); contentPanel.add(buttonPanel, BorderLayout.SOUTH); setContentPane(contentPanel); pack(); } public JComponent createMiddlePanel() { JPanel middlePanel = new JPanel(new GridLayout(0, 1)); middlePanel.add(new JLabel("To see the webexamples, deploy the optaplanner-webexamples-*.war on an application server.")); return middlePanel; } } }