Package de.chris_soft.fyllgen.widget.dialog

Source Code of de.chris_soft.fyllgen.widget.dialog.MultiPersonChoiceShell

/**
* FyLLGen - A Java based tool for collecting and distributing family data
*
* Copyright (C) 2007-2011 Christian Packenius
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
package de.chris_soft.fyllgen.widget.dialog;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.events.ShellListener;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;

import de.chris_soft.fyllgen.GUI;
import de.chris_soft.fyllgen.data.Person;
import de.chris_soft.fyllgen.utilities.SwtConsts;
import de.chris_soft.fyllgen.utilities.SwtUtilities;

/**
* �ber diese Klasse wird ein Dialog erzeugt, in dem mehrere angegebene Personen
* angew�hlt werden k�nnen. Nach dem Aufruf des Konstruktors m�ssen erst die
* Personen eingef�gt werden, anschlie�end wird dann der Dialog ge�ffnet.
* @author Christian Packenius, Juni 2008.
*/
public class MultiPersonChoiceShell extends Dialog implements ShellListener, SelectionListener {
  /**
   * Das eigentliche Fenster-Objekt.
   */
  private Shell shell;

  /**
   * Button, der den Dialog beendet.
   */
  private Button buttonOK;

  /**
   * CheckBox, um alle/keine Personen anzuw�hlen.
   */
  private Button buttonCheckAll;

  /**
   * Zu jeder Person die entsprechende CheckBox.
   */
  private List<Button> personCheckBoxes = new ArrayList<Button>();

  /**
   * Angabe, ob der User den Dialog per "OK"-Taste verlassen hat (true).
   */
  public boolean bPressedOkay = false;

  /**
   * Composite-Objekt, in dem die Checkboxen mit den Personen stecken.
   */
  private Composite personCheckboxesInner;

  /**
   * Scrolled-Composite, in dem das Composite mit den CheckBoxes liegt.
   */
  private ScrolledComposite personCheckboxesScroller;

  /**
   * Nach dem Click auf OK die Liste der angeklickten Personen.
   */
  private List<Person> listOfCheckedPersons;

  private List<Person> persons = new ArrayList<Person>();

  /**
   * Konstruktor. Erzeugt das Fenster, ohne es anzuzeigen.
   * @param parent
   * @param title
   * @param text
   */
  public MultiPersonChoiceShell(Shell parent, String title, String text) {
    super(parent, 0);

    shell = new Shell(parent, SWT.CLOSE | SWT.TITLE | SWT.APPLICATION_MODAL);
    shell.setImage(GUI.instance.shellIcon);
    shell.addShellListener(this);
    shell.setText(title);
    shell.setSize(400, 300);

    // Noch mittig ins vorhandene Fenster setzen.
    SwtUtilities.centerInParent(shell, parent);

    // Shell hat innen einen Rahmen.
    FormLayout shellLayout = new FormLayout();
    shellLayout.marginBottom = shellLayout.marginLeft = shellLayout.marginRight = shellLayout.marginTop = 5;
    shell.setLayout(shellLayout);

    // Innen ein Composite.
    Composite inner = new Composite(shell, 0);
    FormLayout innerLayout = new FormLayout();
    inner.setLayout(innerLayout);
    FormData fd = new FormData();
    fd.top = new FormAttachment(0, 0);
    fd.left = new FormAttachment(0, 0);
    fd.right = new FormAttachment(100, 0);
    fd.bottom = new FormAttachment(100, 0);
    inner.setLayoutData(fd);

    // Fensteraufbau: Oben das Wrap-Label, darunter eine einzelne CheckBox f�r
    // "Alle Personen anw�hlen", ganz unten den "OK"-Button, dazwischen die
    // Personen mit einzelnen CheckBoxen auflisten.
    Label label = new Label(inner, SWT.WRAP);
    label.setText(text);
    fd = new FormData();
    fd.top = new FormAttachment(0, 0);
    fd.left = new FormAttachment(0, 0);
    fd.right = new FormAttachment(100, 0);
    label.setLayoutData(fd);

    // Checkbox, um alles an- oder abzuw�hlen.
    buttonCheckAll = new Button(inner, SWT.CHECK);
    buttonCheckAll.setText("Alle Personen an-/abw�hlen");
    fd = new FormData();
    fd.top = new FormAttachment(label, 5, SWT.BOTTOM);
    fd.left = new FormAttachment(0, 0);
    fd.right = new FormAttachment(100, 0);
    buttonCheckAll.setLayoutData(fd);
    buttonCheckAll.addSelectionListener(this);

    // Ganz unten der OK-Button.
    buttonOK = new Button(inner, SWT.PUSH);
    buttonOK.setText("�bernehmen");
    fd = new FormData();
    fd.bottom = new FormAttachment(100, 0);
    fd.left = new FormAttachment(0, 0);
    fd.right = new FormAttachment(100, 0);
    buttonOK.setLayoutData(fd);
    buttonOK.addSelectionListener(this);
    shell.setDefaultButton(buttonOK);

    // Composite-Objekte f�r Personen-Checkboxen aufbauen.
    personCheckboxesScroller = new ScrolledComposite(inner, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
    fd = new FormData();
    fd.top = new FormAttachment(buttonCheckAll, 5, SWT.BOTTOM);
    fd.bottom = new FormAttachment(buttonOK, -5, SWT.TOP);
    fd.left = new FormAttachment(0, 0);
    fd.right = new FormAttachment(100, 0);
    personCheckboxesScroller.setLayoutData(fd);
    personCheckboxesInner = new Composite(personCheckboxesScroller, 0);
    personCheckboxesScroller.setContent(personCheckboxesInner);
    GridLayout gridLayout = new GridLayout(1, true);
    gridLayout.marginHeight = 1;
    personCheckboxesInner.setLayout(gridLayout);
  }

  /**
   * F�gt eine weitere Person hinzu.
   * @param person
   * @param zusatz Zusatz, der hinten angehangen wird.
   * @param testDoublePersons Falls true, werden doppelt angegebene Personen
   *          ignoriert.
   * @param bCheckIt Angabe, ob die neue CheckBox schon angeklickt sein soll.
   */
  public void add(Person person, String zusatz, boolean testDoublePersons, boolean bCheckIt) {
    // Pr�fen, ob nicht schon in der Liste.
    if (testDoublePersons && persons.contains(person)) {
      return;
    }
    persons.add(person);

    // Zusatz korrigieren.
    zusatz = zusatz == null ? "" : zusatz;

    // Neue Checkbox erzeugen.
    Button checker = new Button(personCheckboxesInner, SWT.CHECK);
    personCheckBoxes.add(checker);
    checker.setText(person.getValueView(Person.NAME) + zusatz);
    checker.setData(person);
    checker.setSelection(bCheckIt);
  }

  /**
   * Shell sichtbar machen. Vorher aber alle Personen in die Liste einf�gen.
   */
  public void open() {
    if (personCheckBoxes.size() == 0) {
      return;
    }

    // Pr�fen, ob alle CheckBoxen schon selektiert sind. Falls ja, auch die
    // globale CheckBox selektieren.
    boolean bAll = true;
    for (Button checkbox : personCheckBoxes) {
      bAll &= checkbox.getSelection();
    }
    buttonCheckAll.setSelection(bAll);

    // personCheckboxesScroller.setContent(personCheckboxesInner);
    // personCheckboxesScroller.setExpandVertical(true);
    // personCheckboxesScroller.setExpandHorizontal(true);
    personCheckboxesInner.setSize(personCheckboxesInner.computeSize(SWT.DEFAULT, SWT.DEFAULT));
    shell.open();

    // Ereignis-Liste abarbeiten.
    while (!shell.isDisposed()) {
      if (!SwtConsts.display.readAndDispatch()) {
        SwtConsts.display.sleep();
      }
    }
  }

  /**
   * @see org.eclipse.swt.events.ShellListener#shellActivated(org.eclipse.swt.events.ShellEvent)
   */
  public void shellActivated(ShellEvent e) {
    // Ignorieren.
  }

  /**
   * @see org.eclipse.swt.events.ShellListener#shellClosed(org.eclipse.swt.events.ShellEvent)
   */
  public void shellClosed(ShellEvent e) {
    shell.removeShellListener(this);
  }

  /**
   * @see org.eclipse.swt.events.ShellListener#shellDeactivated(org.eclipse.swt.events.ShellEvent)
   */
  public void shellDeactivated(ShellEvent e) {
    // Ignorieren.
  }

  /**
   * @see org.eclipse.swt.events.ShellListener#shellDeiconified(org.eclipse.swt.events.ShellEvent)
   */
  public void shellDeiconified(ShellEvent e) {
    // Ignorieren.
  }

  /**
   * @see org.eclipse.swt.events.ShellListener#shellIconified(org.eclipse.swt.events.ShellEvent)
   */
  public void shellIconified(ShellEvent e) {
    // Ignorieren.
  }

  /**
   * Ein Button wurde gedr�ckt.
   * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
   */
  public void widgetDefaultSelected(SelectionEvent e) {
    widgetSelected(e);
  }

  /**
   * Ein Button wurde gedr�ckt.
   * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
   */
  public void widgetSelected(SelectionEvent e) {
    if (e.widget == buttonOK) {
      bPressedOkay = true;

      listOfCheckedPersons = new ArrayList<Person>();
      for (Button checkbox : personCheckBoxes) {
        if (checkbox.getSelection()) {
          listOfCheckedPersons.add((Person) checkbox.getData());
        }
      }

      // Okay, alles wieder l�schen.
      shell.dispose();
    }
    else if (e.widget == buttonCheckAll) {
      boolean b = buttonCheckAll.getSelection();
      for (Button checkbox : personCheckBoxes) {
        checkbox.setSelection(b);
      }
    }
  }

  /**
   * Ermittelt eine Liste aller angeklickten Personen.
   * @return Liste aller angeklickten Personen.
   */
  public List<Person> getCheckedPersons() {
    return listOfCheckedPersons;
  }
}
TOP

Related Classes of de.chris_soft.fyllgen.widget.dialog.MultiPersonChoiceShell

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.