class MeetingAssignmentAction extends AbstractAction {

        private final MeetingAssignment meetingAssignment;

        public MeetingAssignmentAction(MeetingAssignment meetingAssignment) {
            super(meetingAssignment.getLabel());
            putValue(SHORT_DESCRIPTION, "<html>Topic: " + meetingAssignment.getMeeting().getTopic() + "<br/>"
                    + "Date and time: "
                    + Objects.requireNonNullElse(meetingAssignment.getStartingDateTimeString(), "unassigned") + "<br/>"
                    + "Duration: " + meetingAssignment.getMeeting().getDurationString() + "<br/>"
                    + "Room: " + Objects.requireNonNullElse(meetingAssignment.getRoom(), "unassigned")
                    + "</html>");
            this.meetingAssignment = meetingAssignment;
        }

        @Override
        public void actionPerformed(ActionEvent e) {<FILL_FUNCTION_BODY>}

    }

            JPanel listFieldsPanel = new JPanel(new GridLayout(3, 2));
            listFieldsPanel.add(new JLabel("Starting time grain:"));
            MeetingSchedule meetingSchedule = getSolution();
            List<TimeGrain> timeGrainList = meetingSchedule.getTimeGrainList();
            // Add 1 to array size to add null, which makes the entity unassigned
            JComboBox timeGrainListField = new JComboBox(
                    timeGrainList.toArray(new Object[timeGrainList.size() + 1]));
            LabeledComboBoxRenderer.applyToComboBox(timeGrainListField);
            timeGrainListField.setSelectedItem(meetingAssignment.getStartingTimeGrain());
            listFieldsPanel.add(timeGrainListField);
            listFieldsPanel.add(new JLabel("Room:"));
            List<Room> roomList = meetingSchedule.getRoomList();
            // Add 1 to array size to add null, which makes the entity unassigned
            JComboBox roomListField = new JComboBox(
                    roomList.toArray(new Object[roomList.size() + 1]));
            LabeledComboBoxRenderer.applyToComboBox(roomListField);
            roomListField.setSelectedItem(meetingAssignment.getRoom());
            listFieldsPanel.add(roomListField);
            listFieldsPanel.add(new JLabel("Pinned:"));
            JCheckBox pinnedField = new JCheckBox("cannot move during solving");
            pinnedField.setSelected(meetingAssignment.isPinned());
            listFieldsPanel.add(pinnedField);
            int result = JOptionPane.showConfirmDialog(MeetingSchedulingPanel.this.getRootPane(), listFieldsPanel,
                    "Select time grain and room", JOptionPane.OK_CANCEL_OPTION);
            if (result == JOptionPane.OK_OPTION) {
                TimeGrain toStartingTimeGrain = (TimeGrain) timeGrainListField.getSelectedItem();
                if (meetingAssignment.getStartingTimeGrain() != toStartingTimeGrain) {
                    doProblemChange((workingSolution, problemChangeDirector) -> problemChangeDirector.changeVariable(
                            meetingAssignment, "startingTimeGrain",
                            ma -> ma.setStartingTimeGrain(toStartingTimeGrain)));
                }
                Room toRoom = (Room) roomListField.getSelectedItem();
                if (meetingAssignment.getRoom() != toRoom) {
                    doProblemChange((workingSolution, problemChangeDirector) -> problemChangeDirector.changeVariable(
                            meetingAssignment, "room",
                            ma -> ma.setRoom(toRoom)));
                }
                boolean toPinned = pinnedField.isSelected();
                if (meetingAssignment.isPinned() != toPinned) {
                    doProblemChange((workingSolution, problemChangeDirector) -> problemChangeDirector
                            .changeProblemProperty(meetingAssignment, ma -> ma.setPinned(toPinned)));
                }
                solverAndPersistenceFrame.resetScreen();
            }
        
<methods>public non-sealed void <init>() ,public java.awt.Color determinePlanningEntityColor(java.lang.Object, java.lang.Object) ,public java.lang.String determinePlanningEntityTooltip(java.lang.Object) ,public void doProblemChange(ProblemChange<org.optaplanner.examples.meetingscheduling.domain.MeetingSchedule>) ,public void doProblemChange(ProblemChange<org.optaplanner.examples.meetingscheduling.domain.MeetingSchedule>, boolean) ,public java.awt.Dimension getPreferredScrollableViewportSize() ,public int getScrollableBlockIncrement(java.awt.Rectangle, int, int) ,public boolean getScrollableTracksViewportHeight() ,public boolean getScrollableTracksViewportWidth() ,public int getScrollableUnitIncrement(java.awt.Rectangle, int, int) ,public org.optaplanner.examples.meetingscheduling.domain.MeetingSchedule getSolution() ,public SolutionBusiness<org.optaplanner.examples.meetingscheduling.domain.MeetingSchedule,?> getSolutionBusiness() ,public SolverAndPersistenceFrame<org.optaplanner.examples.meetingscheduling.domain.MeetingSchedule> getSolverAndPersistenceFrame() ,public java.lang.String getUsageExplanationPath() ,public boolean isIndictmentHeatMapEnabled() ,public boolean isUseIndictmentColor() ,public boolean isWrapInScrollPane() ,public abstract void resetPanel(org.optaplanner.examples.meetingscheduling.domain.MeetingSchedule) ,public void setSolutionBusiness(SolutionBusiness<org.optaplanner.examples.meetingscheduling.domain.MeetingSchedule,?>) ,public void setSolverAndPersistenceFrame(SolverAndPersistenceFrame<org.optaplanner.examples.meetingscheduling.domain.MeetingSchedule>) ,public void setUseIndictmentColor(boolean) ,public void updatePanel(org.optaplanner.examples.meetingscheduling.domain.MeetingSchedule) <variables>protected static final java.awt.Color[][] INDICTMENT_COLORS,public static final java.awt.Dimension PREFERRED_SCROLLABLE_VIEWPORT_SIZE,protected static final java.lang.String USAGE_EXPLANATION_PATH,protected double[] indictmentMinimumLevelNumbers,protected final transient Logger logger,protected org.optaplanner.swing.impl.TangoColorFactory normalColorFactory,protected SolutionBusiness<org.optaplanner.examples.meetingscheduling.domain.MeetingSchedule,?> solutionBusiness,protected SolverAndPersistenceFrame<org.optaplanner.examples.meetingscheduling.domain.MeetingSchedule> solverAndPersistenceFrame,protected boolean useIndictmentColor