private ListChooser buildReferenceDescriptorChooser() {
   return MappingComponentFactory.buildReferenceDescriptorChooser(
       getSelectionHolder(), getWorkbenchContextHolder());
 }
  protected Component buildPage() {
    JPanel panel = new JPanel(new GridBagLayout());
    panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

    GridBagConstraints constraints = new GridBagConstraints();
    Insets offset = BorderFactory.createTitledBorder("m").getBorderInsets(panel);
    offset.left += 5;
    offset.right += 5;

    // Reference Descriptor chooser
    JComponent referenceDescriptorWidgets =
        buildLabeledComponent(
            "REFERENCE_DESCRIPTOR_CHOOSER_LABEL", buildReferenceDescriptorChooser());

    constraints.gridx = 0;
    constraints.gridy = 0;
    constraints.gridwidth = 1;
    constraints.gridheight = 1;
    constraints.weightx = 1;
    constraints.weighty = 0;
    constraints.fill = GridBagConstraints.HORIZONTAL;
    constraints.anchor = GridBagConstraints.CENTER;
    constraints.insets = new Insets(0, offset.left, 0, offset.right);

    panel.add(referenceDescriptorWidgets, constraints);
    addHelpTopicId(referenceDescriptorWidgets, "mapping.referenceDescriptor");

    // Foreign Keys sub-pane
    ForeignKeysSubPane foreignKeysSubPane = new ForeignKeysSubPane();

    constraints.gridx = 0;
    constraints.gridy = 1;
    constraints.gridwidth = 1;
    constraints.gridheight = 1;
    constraints.weightx = 1;
    constraints.weighty = 0;
    constraints.fill = GridBagConstraints.HORIZONTAL;
    constraints.anchor = GridBagConstraints.CENTER;
    constraints.insets = new Insets(5, 0, 0, 0);

    panel.add(foreignKeysSubPane, constraints);
    addPaneForAlignment(foreignKeysSubPane);

    // Maintain Bidirectionality Relationship
    MaintainsBidirectionalRelationshipPanel maintainBidiRelationshipWidget =
        new MaintainsBidirectionalRelationshipPanel(
            getSelectionHolder(), getWorkbenchContextHolder());

    constraints.gridx = 0;
    constraints.gridy = 2;
    constraints.gridwidth = 1;
    constraints.gridheight = 1;
    constraints.weightx = 1;
    constraints.weighty = 0;
    constraints.fill = GridBagConstraints.HORIZONTAL;
    constraints.anchor = GridBagConstraints.CENTER;
    constraints.insets = new Insets(5, 0, 0, 0);

    panel.add(maintainBidiRelationshipWidget, constraints);
    addPaneForAlignment(maintainBidiRelationshipWidget);

    // Use Method accessing widgets
    MethodAccessingPanel methodAccessingPanel =
        new MethodAccessingPanel(getSelectionHolder(), getWorkbenchContextHolder());

    constraints.gridx = 0;
    constraints.gridy = 3;
    constraints.gridwidth = 1;
    constraints.gridheight = 1;
    constraints.weightx = 1;
    constraints.weighty = 0;
    constraints.fill = GridBagConstraints.HORIZONTAL;
    constraints.anchor = GridBagConstraints.CENTER;
    constraints.insets = new Insets(5, 0, 0, 0);
    panel.add(methodAccessingPanel, constraints);
    addPaneForAlignment(methodAccessingPanel);

    // Read Only
    JCheckBox readOnlyCheckBox =
        MappingComponentFactory.buildReadOnlyCheckBox(
            this.getSelectionHolder(), this.getApplicationContext());

    constraints.gridx = 0;
    constraints.gridy = 4;
    constraints.gridwidth = 1;
    constraints.gridheight = 1;
    constraints.weightx = 0;
    constraints.weighty = 0;
    constraints.fill = GridBagConstraints.NONE;
    constraints.anchor = GridBagConstraints.LINE_START;
    constraints.insets = new Insets(5, 5, 0, 0);

    panel.add(readOnlyCheckBox, constraints);

    // Private Owned
    JCheckBox privateOwnedCheckBox =
        MappingComponentFactory.buildPrivateOwnedCheckBox(
            this.getSelectionHolder(), this.resourceRepository(), this.helpManager());
    constraints.gridx = 0;
    constraints.gridy = 5;
    constraints.gridwidth = 1;
    constraints.gridheight = 1;
    constraints.weightx = 0;
    constraints.weighty = 0;
    constraints.fill = GridBagConstraints.NONE;
    constraints.anchor = GridBagConstraints.LINE_START;
    constraints.insets = new Insets(0, 5, 0, 0);
    panel.add(privateOwnedCheckBox, constraints);

    // Indirectable
    IndirectableContainerMappingPanel indirectablePanel =
        new IndirectableContainerMappingPanel(getSelectionHolder(), getApplicationContext());
    constraints.gridx = 0;
    constraints.gridy = 6;
    constraints.gridwidth = 1;
    constraints.gridheight = 1;
    constraints.weightx = 1;
    constraints.weighty = 0;
    constraints.fill = GridBagConstraints.BOTH;
    constraints.anchor = GridBagConstraints.LINE_START;
    constraints.insets = new Insets(0, 0, 0, 0);
    panel.add(indirectablePanel, constraints);

    // Collection Options Advanced button
    JPanel advancedPanel =
        MappingComponentFactory.buildContainerPolicyOptionsBrowser(
            getWorkbenchContextHolder(), getSelectionHolder(), "mapping.collectionOptions");
    constraints.gridx = 0;
    constraints.gridy = 7;
    constraints.gridwidth = 1;
    constraints.gridheight = 1;
    constraints.weightx = 1;
    constraints.weighty = 0;
    constraints.fill = GridBagConstraints.HORIZONTAL;
    constraints.anchor = GridBagConstraints.LINE_START;
    constraints.insets = new Insets(5, 5, 0, 0);
    panel.add(advancedPanel, constraints);

    // comment
    JComponent commentPanel =
        SwingComponentFactory.buildCommentPanel(getSelectionHolder(), resourceRepository());
    constraints.gridx = 0;
    constraints.gridy = 8;
    constraints.gridwidth = 1;
    constraints.gridheight = 1;
    constraints.weightx = 1;
    constraints.weighty = 1;
    constraints.fill = GridBagConstraints.HORIZONTAL;
    constraints.anchor = GridBagConstraints.PAGE_START;
    constraints.insets = new Insets(5, offset.left, 0, offset.right);
    panel.add(commentPanel, constraints);
    this.addHelpTopicId(commentPanel, "mapping.comment");

    addHelpTopicId(panel, "mapping.oneToMany.general");
    return panel;
  }
  private static JPanel buildContainerOptionsBrowser(
      final WorkbenchContextHolder holder,
      final PropertyValueModel subjectHolder,
      final JPanel subPanel,
      final String topicId) {

    GridBagConstraints constraints = new GridBagConstraints();

    HelpManager help = holder.getWorkbenchContext().getApplicationContext().getHelpManager();

    JPanel container = new JPanel(new GridBagLayout());
    String advancedContainerOptionsTitle =
        holder
            .getWorkbenchContext()
            .getApplicationContext()
            .getResourceRepository()
            .getString("COLLECTION_OPTIONS_ADVANCED_BUTTON");

    subPanel.setVisible(false);
    subPanel.setBorder(
        buildTitledBorder(
            holder.getWorkbenchContext().getApplicationContext().getResourceRepository(),
            "COLLECTION_OPTIONS_ADVANCED_BUTTON"));

    JButton button =
        buildButton(
            "COLLECTION_OPTIONS_ADVANCED_BUTTON",
            holder.getWorkbenchContext().getApplicationContext().getResourceRepository());
    String buttonText = button.getText();
    buttonText += " >>";
    button.setText(buttonText);

    constraints.gridx = 0;
    constraints.gridy = 0;
    constraints.gridwidth = 1;
    constraints.gridheight = 1;
    constraints.weightx = 1;
    constraints.weighty = 0;
    constraints.fill = GridBagConstraints.NONE;
    constraints.anchor = GridBagConstraints.LINE_START;
    constraints.insets = new Insets(0, 0, 0, 0);

    help.addTopicID(button, topicId + ".advancedContainerOptions");
    container.add(button, constraints);

    constraints.gridx = 0;
    constraints.gridy = 1;
    constraints.gridwidth = 1;
    constraints.gridheight = 1;
    constraints.weightx = 1;
    constraints.weighty = 0;
    constraints.fill = GridBagConstraints.HORIZONTAL;
    constraints.anchor = GridBagConstraints.CENTER;
    constraints.insets = new Insets(0, 0, 0, 0);

    help.addTopicID(subPanel, topicId + ".advancedContainerOptions");
    container.add(subPanel, constraints);

    button.addActionListener(
        MappingComponentFactory.buildAdvancedCollectionOptionsButtonActionListener(
            button, subPanel, advancedContainerOptionsTitle));

    return container;
  }