/**
   * Ueberschrieben, um einen DisposeListener an das Composite zu haengen.
   *
   * @see de.willuhn.jameica.gui.parts.TablePart#paint(org.eclipse.swt.widgets.Composite)
   */
  public synchronized void paint(Composite parent) throws RemoteException {
    final TabFolder folder = new TabFolder(parent, SWT.NONE);
    folder.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    TabGroup tab = new TabGroup(folder, i18n.tr("Anzeige einschränken"));

    ColumnLayout cols = new ColumnLayout(tab.getComposite(), 2);

    {
      this.left = new SimpleContainer(cols.getComposite());

      Input t = this.getText();
      this.left.addInput(t);

      // Duerfen wir erst nach dem Zeichnen
      t.getControl().addKeyListener(new DelayedAdapter());

      this.left.addInput(this.getKonto());
    }

    {
      Container right = new SimpleContainer(cols.getComposite());

      right.addInput(this.getRange());
      MultiInput range = new MultiInput(this.getFrom(), this.getTo());
      right.addInput(range);
    }

    this.buttons.addButton(
        i18n.tr("Aktualisieren"),
        new Action() {
          public void handleAction(Object context) throws ApplicationException {
            handleReload(true);
          }
        },
        null,
        true,
        "view-refresh.png");
    this.buttons.paint(parent);

    // Erstbefuellung
    GenericIterator items =
        getList(
            getKonto().getValue(),
            (Date) getFrom().getValue(),
            (Date) getTo().getValue(),
            (String) getText().getValue());
    if (items != null) {
      items.begin();
      while (items.hasNext()) addItem(items.next());
    }

    super.paint(parent);
  }
  /** @see de.willuhn.jameica.gui.dialogs.PasswordDialog#paint(org.eclipse.swt.widgets.Composite) */
  protected void paint(Composite parent) throws Exception {
    Container container = new SimpleContainer(parent, true, 1);
    container.addHeadline(i18n.tr("Matrixcode"));

    MatrixCode code = new MatrixCode(this.hhduc);
    InputStream stream = new ByteArrayInputStream(code.getImage());
    Image image = SWTUtil.getImage(stream);

    // Breite des Dialogs ermitteln (+ ein paar Pixel Toleranz am Rand)
    int width = image.getBounds().width + 200;

    Label imageLabel = new Label(container.getComposite(), SWT.NONE);
    GridData gd = new GridData(GridData.FILL_BOTH);
    gd.horizontalAlignment = SWT.CENTER;
    imageLabel.setLayoutData(gd);
    imageLabel.setImage(image);

    this.setSize(width, SWT.DEFAULT);

    // Hier stehen dann noch die Anweisungen von der Bank drin
    super.paint(parent);
    getShell().setMinimumSize(getShell().computeSize(width, SWT.DEFAULT));
  }
  /** @see de.willuhn.jameica.gui.Part#paint(org.eclipse.swt.widgets.Composite) */
  public void paint(Composite parent) throws RemoteException {
    try {
      if (this.konto == null) {
        if (tiny) {
          ColumnLayout layout = new ColumnLayout(parent, 2);
          Container left = new SimpleContainer(layout.getComposite());
          left.addInput(this.getKontoAuswahl());
          Container right = new SimpleContainer(layout.getComposite());
          right.addInput(this.getRange());
        } else {
          final TabFolder folder = new TabFolder(parent, SWT.NONE);
          folder.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
          TabGroup tab = new TabGroup(folder, i18n.tr("Anzeige einschränken"));

          tab.addInput(this.getKontoAuswahl());
          tab.addInput(this.getRange());

          ButtonArea buttons = new ButtonArea();
          buttons.addButton(
              i18n.tr("Aktualisieren"),
              new Action() {

                /** @see de.willuhn.jameica.gui.Action#handleAction(java.lang.Object) */
                public void handleAction(Object context) throws ApplicationException {
                  reloadListener.handleEvent(new Event());
                }
              },
              null,
              true,
              "view-refresh.png");

          buttons.paint(parent);
        }
      } else {
        Container container = new SimpleContainer(parent);
        container.addInput(this.getRange());
      }

      this.chart = new LineChart();
      this.reloadListener.handleEvent(null); // einmal initial ausloesen
      chart.paint(parent);
    } catch (RemoteException re) {
      throw re;
    } catch (Exception e) {
      Logger.error("unable to paint chart", e);
      Application.getMessagingFactory()
          .sendMessage(
              new StatusBarMessage(
                  i18n.tr("Fehler beim Anzeigen des Saldo-Verlaufs"), StatusBarMessage.TYPE_ERROR));
    }
  }
  /**
   * @see
   *     de.willuhn.jameica.gui.dialogs.PasswordDialog#extend(de.willuhn.jameica.gui.util.Container)
   */
  protected void extend(Container container) throws Exception {
    if (this.filename == null) return;

    Part p =
        new Part() {
          public void paint(Composite parent) throws RemoteException {
            String text = i18n.tr("Schlüssel-Datei: {0}", filename);

            final Label comment = new Label(parent, SWT.WRAP);
            comment.setText(text);
            comment.setForeground(Color.COMMENT.getSWTColor());
            comment.setLayoutData(new GridData(GridData.FILL_BOTH));
            // Workaround fuer Windows, weil dort mehrzeilige
            // Labels nicht korrekt umgebrochen werden.
            comment.addControlListener(
                new ControlAdapter() {
                  public void controlResized(ControlEvent e) {
                    comment.setSize(comment.computeSize(comment.getSize().x, SWT.DEFAULT));
                  }
                });
          }
        };
    container.addPart(p);
  }
  /** @see de.willuhn.jameica.gui.AbstractView#bind() */
  public void bind() throws Exception {
    final AuslandsUeberweisungControl control = new AuslandsUeberweisungControl(this);
    this.transfer = control.getTransfer();

    GUI.getView().setTitle(i18n.tr("SEPA-Überweisung bearbeiten"));
    GUI.getView()
        .addPanelButton(
            new PanelButton(
                "edit-select-all.png",
                new SepaExportUeberweisung(transfer),
                i18n.tr("Als SEPA-XML-Datei exportieren...")));
    GUI.getView()
        .addPanelButton(new PanelButtonPrint(new PrintSupportAuslandsUeberweisung(transfer)));

    Container cl = new SimpleContainer(getParent());
    cl.addHeadline(i18n.tr("Konto"));
    cl.addInput(control.getKontoAuswahl());

    ColumnLayout cols = new ColumnLayout(getParent(), 2);

    // Linke Seite
    {
      Container container = new SimpleContainer(cols.getComposite());
      container.addHeadline(i18n.tr("Empfänger"));
      container.addLabelPair(i18n.tr("Name"), control.getEmpfaengerName());
      container.addLabelPair(i18n.tr("IBAN"), control.getEmpfaengerKonto());
      container.addLabelPair(i18n.tr("BIC"), control.getEmpfaengerBic());
      container.addCheckbox(control.getStoreEmpfaenger(), i18n.tr("In Adressbuch übernehmen"));
    }

    // Rechte Seite
    {
      Container container = new SimpleContainer(cols.getComposite());
      container.addHeadline(i18n.tr("SEPA"));
      container.addInput(control.getEndToEndId());
      container.addHeadline(i18n.tr("Sonstige Informationen (nur Hibiscus-intern)"));
      container.addText(i18n.tr("Diese Daten werden nicht an die Bank übertragen."), true);
      container.addInput(control.getTermin());
      container.addInput(control.getReminderInterval());
    }

    Container container = new SimpleContainer(getParent());
    container.addHeadline(i18n.tr("Details"));
    container.addLabelPair(i18n.tr("Verwendungszweck"), control.getZweck());
    container.addLabelPair(i18n.tr("Betrag"), control.getBetrag());

    ButtonArea buttonArea = new ButtonArea();
    buttonArea.addButton(
        i18n.tr("Löschen"), new DBObjectDelete(), transfer, false, "user-trash-full.png");
    buttonArea.addButton(
        i18n.tr("Duplizieren..."),
        new Action() {
          public void handleAction(Object context) throws ApplicationException {
            if (control.handleStore()) // BUGZILLA 1181
            new Duplicate().handleAction(transfer);
          }
        },
        null,
        false,
        "edit-copy.png");

    Button execute =
        new Button(
            i18n.tr("Jetzt ausführen..."),
            new Action() {
              public void handleAction(Object context) throws ApplicationException {
                if (control.handleStore()) new AuslandsUeberweisungExecute().handleAction(transfer);
              }
            },
            null,
            false,
            "emblem-important.png");
    execute.setEnabled(!transfer.ausgefuehrt());

    Button store =
        new Button(
            i18n.tr("Speichern"),
            new Action() {
              public void handleAction(Object context) throws ApplicationException {
                control.handleStore();
              }
            },
            null,
            !transfer.ausgefuehrt(),
            "document-save.png");
    store.setEnabled(!transfer.ausgefuehrt());

    buttonArea.addButton(execute);
    buttonArea.addButton(store);

    buttonArea.paint(getParent());

    Application.getMessagingFactory().registerMessageConsumer(this.mc);
  }
  /** @see de.willuhn.jameica.gui.AbstractView#bind() */
  public void bind() throws Exception {
    // draw the title
    GUI.getView().setTitle(Settings.i18n().tr("Project details"));

    // instanciate controller
    final ProjectControl control = new ProjectControl(this);

    Container c = new SimpleContainer(getParent());

    // layout with 2 columns
    ColumnLayout columns = new ColumnLayout(c.getComposite(), 2);

    // left side
    Container left = new SimpleContainer(columns.getComposite());
    left.addHeadline(Settings.i18n().tr("Details"));
    left.addInput(control.getName());
    left.addInput(control.getPrice());
    left.addInput(control.getStartDate());
    left.addInput(control.getEndDate());

    // right side
    Container right = new SimpleContainer(columns.getComposite(), true);
    right.addHeadline(Settings.i18n().tr("Description"));
    right.addInput(control.getDescription());

    c.addHeadline(Settings.i18n().tr("Summary"));
    c.addInput(control.getEffortSummary());

    // add some buttons
    ButtonArea buttons = new ButtonArea();
    buttons.addButton(Settings.i18n().tr("New Task"), new TaskDetail(), control.getCurrentObject());
    buttons.addButton(
        Settings.i18n().tr("Delete"), new ProjectDelete(), control.getCurrentObject());
    buttons.addButton(
        Settings.i18n().tr("Store"),
        new Action() {
          public void handleAction(Object context) throws ApplicationException {
            control.handleStore();
          }
        },
        null,
        true); // "true" defines this button as the default button

    // Don't forget to paint the button area
    buttons.paint(getParent());

    // show task tasks in this project
    new Headline(getParent(), Settings.i18n().tr("Tasks within this project"));
    control.getTaskList().paint(getParent());
  }
  /** @see de.willuhn.jameica.gui.dialogs.AbstractDialog#paint(org.eclipse.swt.widgets.Composite) */
  protected void paint(Composite parent) throws Exception {
    Container group = new SimpleContainer(parent);
    group.addHeadline(i18n.tr("Details des Dauerauftrages"));

    Input kto = new LabelInput(auftrag.getKonto().getKontonummer());
    kto.setComment(auftrag.getKonto().getBezeichnung());
    group.addLabelPair(i18n.tr("Eigenes Konto"), kto);

    Input empfName = new LabelInput(auftrag.getGegenkontoName());
    group.addLabelPair(i18n.tr("Name des Empfänger"), empfName);

    Input empfKto = new LabelInput(auftrag.getGegenkontoNummer());
    empfKto.setComment(
        auftrag.getGegenkontoBLZ() + "/" + HBCIUtils.getNameForBLZ(auftrag.getGegenkontoBLZ()));
    group.addLabelPair(i18n.tr("Konto des Empfängers"), empfKto);

    LabelInput betrag =
        new LabelInput(
            HBCI.DECIMALFORMAT.format(auftrag.getBetrag())
                + " "
                + auftrag.getKonto().getWaehrung());
    betrag.setColor(Color.ERROR);
    group.addLabelPair(i18n.tr("Betrag"), betrag);

    group.addSeparator();

    Date e = auftrag.getErsteZahlung();
    String se = i18n.tr("Zum nächstmöglichen Termin");
    if (e != null) se = HBCI.DATEFORMAT.format(e);
    Input ersteZahlung = new LabelInput(se);
    group.addLabelPair(i18n.tr("Erste Zahlung"), ersteZahlung);

    Date l = auftrag.getLetzteZahlung();
    String sl = i18n.tr("keine End-Datum vorgegeben");
    if (l != null) sl = HBCI.DATEFORMAT.format(l);
    Input letzteZahlung = new LabelInput(sl);
    group.addLabelPair(i18n.tr("Letzte Zahlung"), letzteZahlung);

    Input turnus = new LabelInput(TurnusHelper.createBezeichnung(auftrag.getTurnus()));
    group.addLabelPair(i18n.tr("Zahlungsturnus"), turnus);

    group.addHeadline(i18n.tr("Verwendungszweck"));
    group.addText(VerwendungszweckUtil.toString(auftrag, "\n"), false);

    if (auftrag.isActive())
      group.addText(
          i18n.tr("Sind Sie sicher, daß Sie diese Änderungen jetzt zur Bank senden wollen?") + "\n",
          true);
    else
      group.addText(
          i18n.tr("Sind Sie sicher, daß Sie diesen Dauerauftrag jetzt ausführen wollen?") + "\n",
          true);

    super.paint(parent);
    getShell().setMinimumSize(getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT));
  }