/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
 * 
 * This 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 2 of the License, or
 * (at your option) any later version.
 * 
 * This software 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 software; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
 * USA.
 */
//
// OptionsDialog.h
//

#ifndef __OPTIONSDIALOG_H__
#define __OPTIONSDIALOG_H__

#include "TXDialog.h"
#include "TXLabel.h"
#include "TXEntry.h"
#include "TXButton.h"
#include "TXCheckbox.h"
#include "parameters.h"

class OptionsDialogCallback {
public:
  virtual void setOptions() = 0;
  virtual void getOptions() = 0;
};

class OptionsDialog : public TXDialog, public TXButtonCallback,
                      public TXCheckboxCallback, public TXEntryCallback  {
public:
  OptionsDialog(Display* dpy, OptionsDialogCallback* cb_)
    : TXDialog(dpy, 450, 450, _("VNC Viewer: Connection Options")), cb(cb_),
      formatAndEnc(dpy, _("Encoding and Color Level:"), this),
      inputs(dpy, _("Inputs:"), this),
      misc(dpy, _("Misc:"), this),
      autoSelect(dpy, _("Auto select"), this, false, this),
      fullColour(dpy, _("Full (all available colors)"), this, true, this),
      mediumColour(dpy, _("Medium (256 colors)"), this, true, this),
      lowColour(dpy, _("Low (64 colors)"), this, true, this),
      veryLowColour(dpy, _("Very low (8 colors)"), this, true, this),
      tight(dpy, "Tight", this, true, this),
      zrle(dpy, "ZRLE", this, true, this),
      hextile(dpy, "Hextile", this, true, this),
      raw(dpy, "Raw", this, true, this),
      customCompressLevel(dpy, _("Custom compression level:"), this, false, this),
      compressLevel(dpy, this, this, false, 30),
      compressLevelLabel(dpy, _("level (1=fast, 9=best)"), this),
      noJpeg(dpy, _("Allow JPEG compression:"), this, false, this),
      qualityLevel(dpy, this, this, false, 30),
      qualityLevelLabel(dpy, _("quality (1=poor, 9=best)"), this),
      viewOnly(dpy, _("View only (ignore mouse & keyboard)"), this, false, this),
      acceptClipboard(dpy, _("Accept clipboard from server"), this, false, this),
      sendClipboard(dpy, _("Send clipboard to server"), this, false, this),
      sendPrimary(dpy, _("Send primary selection & cut buffer as clipboard"),
                  this, false, this),
      shared(dpy, _("Shared (don't disconnect other viewers)"), this, false,this),
      fullScreen(dpy, _("Full-screen mode"), this, false, this),
      useLocalCursor(dpy, _("Render cursor locally"), this, false, this),
      dotWhenNoCursor(dpy, _("Show dot when no cursor"), this, false, this),
      okButton(dpy, _("OK"), this, this, 60),
      cancelButton(dpy, _("Cancel"), this, this, 60)
  {
    int y = yPad;
    formatAndEnc.move(xPad, y);
    y += formatAndEnc.height();
    autoSelect.move(xPad, y);
    int x2 = xPad + autoSelect.width() + xPad*5;
    y += autoSelect.height();
    tight.move(xPad, y);
    fullColour.move(x2, y);
    y += tight.height();
    zrle.move(xPad, y);
    mediumColour.move(x2, y);
    y += zrle.height();
    hextile.move(xPad, y);
    lowColour.move(x2, y);
    y += hextile.height();
    raw.move(xPad, y);
    veryLowColour.move(x2, y);
    y += raw.height() + yPad*2;

    customCompressLevel.move(xPad, y);
    y += customCompressLevel.height();
    compressLevel.move(xPad*10, y);
    compressLevelLabel.move(xPad*20, y);
    y += compressLevel.height();

    noJpeg.move(xPad, y);
    y += noJpeg.height();
    qualityLevel.move(xPad*10, y);
    qualityLevelLabel.move(xPad*20, y);
    y += qualityLevel.height();

    y += yPad*4;
    inputs.move(xPad, y);
    y += inputs.height();
    viewOnly.move(xPad, y);
    y += viewOnly.height();
    acceptClipboard.move(xPad, y);
    y += acceptClipboard.height();
    sendClipboard.move(xPad, y);
    y += sendClipboard.height();
    sendPrimary.move(xPad, y);
    y += sendPrimary.height();

    y += yPad*4;
    misc.move(xPad, y);
    y += misc.height();
    shared.move(xPad, y);
    y += shared.height();
    fullScreen.move(xPad, y);
    y += fullScreen.height();
    useLocalCursor.move(xPad, y);
    y += useLocalCursor.height();
    dotWhenNoCursor.move(xPad, y);
    y += dotWhenNoCursor.height();

    okButton.move(width() - xPad*12 - cancelButton.width() - okButton.width(),
                  height() - yPad*4 - okButton.height());
    cancelButton.move(width() - xPad*6 - cancelButton.width(),
                      height() - yPad*4 - cancelButton.height());
    setBorderWidth(1);
  }

  virtual void initDialog() {
    if (cb) cb->setOptions();
    tight.disabled(autoSelect.checked());
    zrle.disabled(autoSelect.checked());
    hextile.disabled(autoSelect.checked());
    raw.disabled(autoSelect.checked());
    fullColour.disabled(autoSelect.checked());
    mediumColour.disabled(autoSelect.checked());
    lowColour.disabled(autoSelect.checked());
    veryLowColour.disabled(autoSelect.checked());
    sendPrimary.disabled(!sendClipboard.checked());
    dotWhenNoCursor.disabled(!useLocalCursor.checked());
    compressLevel.disabled(!customCompressLevel.checked());
    qualityLevel.disabled(autoSelect.checked() || !noJpeg.checked());
  }

  virtual void takeFocus(Time time) {
    //XSetInputFocus(dpy, entry.win, RevertToParent, time);
  }

  virtual void buttonActivate(TXButton* b) {
    if (b == &okButton) {
      if (cb) cb->getOptions();
      unmap();
    } else if (b == &cancelButton) {
      unmap();
    }
  }

  virtual void checkboxSelect(TXCheckbox* checkbox) {
    if (checkbox == &autoSelect) {
      tight.disabled(autoSelect.checked());
      zrle.disabled(autoSelect.checked());
      hextile.disabled(autoSelect.checked());
      raw.disabled(autoSelect.checked());
      fullColour.disabled(autoSelect.checked());
      mediumColour.disabled(autoSelect.checked());
      lowColour.disabled(autoSelect.checked());
      veryLowColour.disabled(autoSelect.checked());
      qualityLevel.disabled(autoSelect.checked() || !noJpeg.checked());
    } else if (checkbox == &fullColour || checkbox == &mediumColour ||
               checkbox == &lowColour || checkbox == &veryLowColour) {
      fullColour.checked(checkbox == &fullColour);
      mediumColour.checked(checkbox == &mediumColour);
      lowColour.checked(checkbox == &lowColour);
      veryLowColour.checked(checkbox == &veryLowColour);
    } else if (checkbox == &tight || checkbox == &zrle || checkbox == &hextile || checkbox == &raw) {
      tight.checked(checkbox == &tight);
      zrle.checked(checkbox == &zrle);
      hextile.checked(checkbox == &hextile);
      raw.checked(checkbox == &raw);
    } else if (checkbox == &sendClipboard) {
      sendPrimary.disabled(!sendClipboard.checked());
    } else if (checkbox == &useLocalCursor) {
      dotWhenNoCursor.disabled(!useLocalCursor.checked());
    } else if (checkbox == &customCompressLevel) {
      compressLevel.disabled(!customCompressLevel.checked());
    } else if (checkbox == &noJpeg) {
      qualityLevel.disabled(autoSelect.checked() || !noJpeg.checked());
    }
  }

  virtual void entryCallback(TXEntry* e, Detail detail, Time time) {
  }

  OptionsDialogCallback* cb;
  TXLabel formatAndEnc, inputs, misc;
  TXCheckbox autoSelect;
  TXCheckbox fullColour, mediumColour, lowColour, veryLowColour;
  TXCheckbox tight, zrle, hextile, raw;

  TXCheckbox customCompressLevel; TXEntry compressLevel; TXLabel compressLevelLabel;
  TXCheckbox noJpeg; TXEntry qualityLevel; TXLabel qualityLevelLabel;

  TXCheckbox viewOnly, acceptClipboard, sendClipboard, sendPrimary;
  TXCheckbox shared, fullScreen, useLocalCursor, dotWhenNoCursor;
  TXButton okButton, cancelButton;
};

#endif