inputstring.cpp 4.63 KB
Newer Older
dimitri's avatar
dimitri committed
1 2
/******************************************************************************
 *
dimitri's avatar
dimitri committed
3
 * 
dimitri's avatar
dimitri committed
4
 *
dimitri's avatar
dimitri committed
5
 * Copyright (C) 1997-2011 by Dimitri van Heesch.
dimitri's avatar
dimitri committed
6 7 8 9 10 11 12 13 14 15
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation under the terms of the GNU General Public License is hereby 
 * granted. No representations are made about the suitability of this software 
 * for any purpose. It is provided "as is" without express or implied warranty.
 * See the GNU General Public License for more details.
 *
 */

#include "inputstring.h"
dimitri's avatar
dimitri committed
16 17 18 19 20 21 22 23
#include "helplabel.h"
#include "doxywizard.h"
#include "config.h"

#include <QtGui>

InputString::InputString( QGridLayout *layout,int &row,
                          const QString & id, const QString &s, 
dimitri's avatar
dimitri committed
24 25 26 27
                          StringMode m, const QString &docs,
                          const QString &absPath )
  : m_default(s), m_sm(m), m_index(0), m_docs(docs), m_id(id),
    m_absPath(absPath==QString::fromAscii("1"))
dimitri's avatar
dimitri committed
28
{
dimitri's avatar
dimitri committed
29
  m_lab = new HelpLabel(id);
dimitri's avatar
dimitri committed
30 31
  if (m==StringFixed)
  {
dimitri's avatar
dimitri committed
32 33 34 35 36 37
    layout->addWidget( m_lab, row, 0 );
    m_com = new QComboBox; 
    layout->addWidget( m_com, row, 1, 1, 3, Qt::AlignLeft );
    m_le=0;
    m_br=0;
    row++;
dimitri's avatar
dimitri committed
38 39 40
  }
  else
  {
dimitri's avatar
dimitri committed
41 42 43 44
    layout->addWidget( m_lab, row, 0 );
    m_le = new QLineEdit;
    m_le->setText( s );
    //layout->setColumnMinimumWidth(2,150);
dimitri's avatar
dimitri committed
45 46
    if (m==StringFile || m==StringDir)
    {
dimitri's avatar
dimitri committed
47 48 49
      layout->addWidget( m_le, row, 1 );
      m_br = new QToolBar;
      m_br->setIconSize(QSize(24,24));
dimitri's avatar
dimitri committed
50
      if (m==StringFile) 
dimitri's avatar
dimitri committed
51
      {
dimitri's avatar
dimitri committed
52 53
        QAction *file = m_br->addAction(QIcon(QString::fromAscii(":/images/file.png")),QString(),this,SLOT(browse()));
        file->setToolTip(tr("Browse to a file"));
dimitri's avatar
dimitri committed
54
      }
dimitri's avatar
dimitri committed
55
      else 
dimitri's avatar
dimitri committed
56
      {
dimitri's avatar
dimitri committed
57 58
        QAction *dir = m_br->addAction(QIcon(QString::fromAscii(":/images/folder.png")),QString(),this,SLOT(browse()));
        dir->setToolTip(tr("Browse to a folder"));
dimitri's avatar
dimitri committed
59
      }
dimitri's avatar
dimitri committed
60
      layout->addWidget( m_br,row,2 );
dimitri's avatar
dimitri committed
61 62 63
    }
    else
    {
dimitri's avatar
dimitri committed
64 65
      layout->addWidget( m_le, row, 1, 1, 2 );
      m_br=0;
dimitri's avatar
dimitri committed
66
    }
dimitri's avatar
dimitri committed
67 68
    m_com=0;
    row++;
dimitri's avatar
dimitri committed
69 70
  }

dimitri's avatar
dimitri committed
71 72 73 74 75 76 77 78 79 80 81 82 83
  if (m_le)  connect( m_le,   SIGNAL(textChanged(const QString&)), 
                      this,   SLOT(setValue(const QString&)) );
  if (m_com) connect( m_com,  SIGNAL(activated(const QString &)), 
                      this,   SLOT(setValue(const QString &)) );
  m_str = s+QChar::fromAscii('!'); // force update
  setValue(s);
  connect( m_lab, SIGNAL(enter()), SLOT(help()) );
  connect( m_lab, SIGNAL(reset()), SLOT(reset()) );
}

void InputString::help()
{
  showHelp(this);
dimitri's avatar
dimitri committed
84 85
}

dimitri's avatar
dimitri committed
86

dimitri's avatar
dimitri committed
87 88 89 90 91
InputString::~InputString()
{
}


dimitri's avatar
dimitri committed
92
void InputString::setValue(const QString &s)
dimitri's avatar
dimitri committed
93
{
dimitri's avatar
dimitri committed
94
  if (m_str!=s)
dimitri's avatar
dimitri committed
95
  {
dimitri's avatar
dimitri committed
96 97 98 99 100 101 102 103 104 105
    m_str = s;
    m_value = m_str;
    if (m_str==m_default)
    {
      m_lab->setText(QString::fromAscii("<qt>")+m_id+QString::fromAscii("</qt"));
    }
    else
    {
      m_lab->setText(QString::fromAscii("<qt><font color='red'>")+m_id+QString::fromAscii("</font></qt>"));
    }
dimitri's avatar
dimitri committed
106
    if (m_le && m_le->text()!=m_str) m_le->setText( m_str );
dimitri's avatar
dimitri committed
107 108 109 110 111 112
    emit changed();
  }
}

void InputString::setEnabled(bool state)
{
dimitri's avatar
dimitri committed
113 114 115 116
  m_lab->setEnabled(state);
  if (m_le)  m_le->setEnabled(state);
  if (m_br)  m_br->setEnabled(state);
  if (m_com) m_com->setEnabled(state);
dimitri's avatar
dimitri committed
117 118 119 120
}

void InputString::browse()
{
dimitri's avatar
dimitri committed
121 122
  QString path = QFileInfo(MainWindow::instance().configFileName()).path();
  if (m_sm==StringFile)
dimitri's avatar
dimitri committed
123
  {
dimitri's avatar
dimitri committed
124 125
    QString fileName = QFileDialog::getOpenFileName(&MainWindow::instance(),
        tr("Select file"),path);
dimitri's avatar
dimitri committed
126 127
    if (!fileName.isNull()) 
    {
dimitri's avatar
dimitri committed
128 129
      QDir dir(path);
      if (!MainWindow::instance().configFileName().isEmpty() && dir.exists())
dimitri's avatar
dimitri committed
130
      {
dimitri's avatar
dimitri committed
131
        fileName = m_absPath ? fileName : dir.relativeFilePath(fileName);
dimitri's avatar
dimitri committed
132
      }
dimitri's avatar
dimitri committed
133
      setValue(fileName);
dimitri's avatar
dimitri committed
134 135 136 137
    }
  }
  else // sm==StringDir
  {
dimitri's avatar
dimitri committed
138 139
    QString dirName = QFileDialog::getExistingDirectory(&MainWindow::instance(),
        tr("Select directory"),path);
dimitri's avatar
dimitri committed
140 141
    if (!dirName.isNull())
    {
dimitri's avatar
dimitri committed
142 143
      QDir dir(path);
      if (!MainWindow::instance().configFileName().isEmpty() && dir.exists())
dimitri's avatar
dimitri committed
144
      {
dimitri's avatar
dimitri committed
145
        dirName = m_absPath ? dirName : dir.relativeFilePath(dirName);
dimitri's avatar
dimitri committed
146
      }
dimitri's avatar
dimitri committed
147
      setValue(dirName);
dimitri's avatar
dimitri committed
148
    }
dimitri's avatar
dimitri committed
149 150 151 152 153
  }
}

void InputString::clear()
{
dimitri's avatar
dimitri committed
154
  setValue(QString());
dimitri's avatar
dimitri committed
155 156
}

dimitri's avatar
dimitri committed
157
void InputString::addValue(QString s)
dimitri's avatar
dimitri committed
158
{
dimitri's avatar
dimitri committed
159
  if (m_sm==StringFixed)
dimitri's avatar
dimitri committed
160
  {
dimitri's avatar
dimitri committed
161 162
    m_values.append(s);
    m_com->addItem(s);
dimitri's avatar
dimitri committed
163 164 165
  }
}

dimitri's avatar
dimitri committed
166
void InputString::setDefault()
dimitri's avatar
dimitri committed
167
{
dimitri's avatar
dimitri committed
168 169
  int index = m_values.indexOf(m_str);
  if (index!=-1 && m_com) m_com->setCurrentIndex(index);
dimitri's avatar
dimitri committed
170
}
dimitri's avatar
dimitri committed
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193

QVariant &InputString::value() 
{
  return m_value;
}

void InputString::update()
{
  setValue(m_value.toString().trimmed());
  setDefault();
}

void InputString::reset()
{
  setValue(m_default);
  setDefault();
}

void InputString::writeValue(QTextStream &t,QTextCodec *codec)
{
  writeStringValue(t,codec,m_str);
}