private void fillGUI() {
    Object[] attributes;
    boolean enabled;
    if (context != null) {
      attributes = this.context.getAttributes().toArray();
      enabled = true;
    } else {
      attributes = new Object[] {"No context available"};
      enabled = false;
    }

    sequenceColumnChooser.setModel(new DefaultComboBoxModel(attributes));
    sequenceColumnChooser.setEnabled(enabled);

    timelineColumnChooser.setModel(new DefaultComboBoxModel(attributes));
    timelineColumnChooser.setEnabled(enabled);
    if (context != null) {
      timelineColumnChooser.setSelectedIndex(Math.min(attributes.length - 1, 1));
    }

    calculateValueLists();
    fillSequenceChooser();

    setButtonStates(!enabled);
  }
  private void calculateValueLists() {
    sequenceValues = new ArrayList<>();
    timelineValues = new ArrayList<>();

    final Object selectedSequenceColumn = this.sequenceColumnChooser.getSelectedItem();
    if (!(selectedSequenceColumn instanceof ManyValuedAttribute)) {
      return;
    }
    final ManyValuedAttribute sequenceAttribute = (ManyValuedAttribute) selectedSequenceColumn;
    final ManyValuedAttribute timelineAttribute =
        (ManyValuedAttribute) timelineColumnChooser.getSelectedItem();

    for (final FCAElement object : this.context.getObjects()) {
      Value value = this.context.getRelationship(object, sequenceAttribute);
      if (!sequenceValues.contains(value) && value != null) {
        boolean inserted = false;
        final ListIterator<Value> seqIt = sequenceValues.listIterator();
        while (seqIt.hasNext()) {
          final Value curValue = seqIt.next();
          if (value.isLesserThan(curValue)) {
            if (seqIt.hasPrevious()) {
              seqIt.previous();
            }
            seqIt.add(value);
            inserted = true;
            break;
          }
        }
        if (!inserted) {
          seqIt.add(value);
        }
      }
      value = this.context.getRelationship(object, timelineAttribute);
      if (!timelineValues.contains(value) && value != null) {
        boolean inserted = false;
        final ListIterator<Value> tlIt = timelineValues.listIterator();
        while (tlIt.hasNext()) {
          final Value curValue = tlIt.next();
          if (curValue != null && value.isLesserThan(curValue)) {
            if (tlIt.hasPrevious()) {
              tlIt.previous();
            }
            tlIt.add(value);
            inserted = true;
            break;
          }
        }
        if (!inserted) {
          tlIt.add(value);
        }
      }
    }
  }
  private List<ArrayList<FCAElement>> calculateObjectSequences() {
    final ManyValuedAttribute sequenceAttribute =
        (ManyValuedAttribute) sequenceColumnChooser.getSelectedItem();
    final ManyValuedAttribute timelineAttribute =
        (ManyValuedAttribute) timelineColumnChooser.getSelectedItem();

    final List<ArrayList<FCAElement>> objectSequences = new ArrayList<>();

    // initialise sequences with empty lists
    for (Value ignored : sequenceValues) {
      objectSequences.add(new ArrayList<FCAElement>());
    }

    // go over time
    for (Value timelineValue : timelineValues) {
      // try to find matching object for each sequence
      Iterator<Value> seqValIt = sequenceValues.iterator();
      final Iterator<ArrayList<FCAElement>> seqIt = objectSequences.iterator();
      while (seqValIt.hasNext()) {
        final Value sequenceValue = seqValIt.next();
        final List<FCAElement> sequence = seqIt.next();
        boolean objectFound = false;
        for (FCAElement object : this.context.getObjects()) {
          if (this.context.getRelationship(object, sequenceAttribute) != null
              && this.context.getRelationship(object, sequenceAttribute).equals(sequenceValue)
              && this.context.getRelationship(object, timelineAttribute) != null
              && this.context.getRelationship(object, timelineAttribute).equals(timelineValue)) {
            sequence.add(object);
            objectFound = true;
            break;
          }
        }
        if (!objectFound) {
          sequence.add(null);
        }
      }
    }

    return objectSequences;
  }
  private JPanel createBasicSettingsPanel() {
    final JLabel sequenceColumnLabel = new JLabel("Sequence Column:");
    sequenceColumnChooser = new JComboBox();
    sequenceColumnChooser.addActionListener(
        new ActionListener() {
          public void actionPerformed(final ActionEvent e) {
            calculateValueLists();
            fillSequenceChooser();
          }
        });

    final JLabel timelineLabel = new JLabel("Timeline Column:");
    timelineColumnChooser = new JComboBox();
    timelineColumnChooser.addActionListener(
        new ActionListener() {
          public void actionPerformed(final ActionEvent e) {
            calculateValueLists();
            fillSequenceChooser();
          }
        });

    final JLabel sequenceLabel = new JLabel("Sequence:");
    sequenceToShowChooser = new JList<>();

    serializeSequencesBox = new JCheckBox("Serialize when stepping/animating");

    final JPanel basicSettingsPanel = new JPanel(new GridBagLayout());
    int r = 0;
    basicSettingsPanel.add(
        sequenceColumnLabel,
        new GridBagConstraints(
            0,
            r,
            1,
            1,
            1,
            0,
            GridBagConstraints.WEST,
            GridBagConstraints.HORIZONTAL,
            DEFAULT_LABEL_INSETS,
            0,
            0));
    r++;
    basicSettingsPanel.add(
        sequenceColumnChooser,
        new GridBagConstraints(
            0,
            r,
            1,
            1,
            1,
            0,
            GridBagConstraints.EAST,
            GridBagConstraints.HORIZONTAL,
            DEFAULT_FIELD_INSETS,
            0,
            0));
    r++;
    basicSettingsPanel.add(
        timelineLabel,
        new GridBagConstraints(
            0,
            r,
            1,
            1,
            1,
            0,
            GridBagConstraints.WEST,
            GridBagConstraints.HORIZONTAL,
            DEFAULT_LABEL_INSETS,
            0,
            0));
    r++;
    basicSettingsPanel.add(
        timelineColumnChooser,
        new GridBagConstraints(
            0,
            r,
            1,
            1,
            1,
            0,
            GridBagConstraints.EAST,
            GridBagConstraints.HORIZONTAL,
            DEFAULT_FIELD_INSETS,
            0,
            0));
    r++;
    basicSettingsPanel.add(
        sequenceLabel,
        new GridBagConstraints(
            0,
            r,
            1,
            1,
            1,
            0,
            GridBagConstraints.WEST,
            GridBagConstraints.HORIZONTAL,
            DEFAULT_LABEL_INSETS,
            0,
            0));
    r++;
    basicSettingsPanel.add(
        sequenceToShowChooser,
        new GridBagConstraints(
            0,
            r,
            1,
            1,
            1,
            0,
            GridBagConstraints.EAST,
            GridBagConstraints.HORIZONTAL,
            DEFAULT_FIELD_INSETS,
            0,
            0));
    r++;
    basicSettingsPanel.add(
        serializeSequencesBox,
        new GridBagConstraints(
            0,
            r,
            1,
            1,
            1,
            0,
            GridBagConstraints.CENTER,
            GridBagConstraints.NONE,
            new Insets(2, 2, 2, 2),
            0,
            0));
    r++;
    basicSettingsPanel.add(
        new JPanel(),
        new GridBagConstraints(
            0,
            r,
            1,
            1,
            1,
            1,
            GridBagConstraints.CENTER,
            GridBagConstraints.NONE,
            DEFAULT_SPACER_INSETS,
            0,
            0));
    return basicSettingsPanel;
  }