You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tqscintilla/qt/qextscintillaapis.cpp

211 lines
3.8 KiB

// This module implements the QextScintillaAPIs class.
//
// Copyright (c) 2006
// Riverbank Computing Limited <info@riverbankcomputing.co.uk>
//
// This file is part of TQScintilla.
//
// This copy of TQScintilla 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, or (at your option) any
// later version.
//
// TQScintilla is supplied 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
// TQScintilla; see the file LICENSE. If not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include <tqfile.h>
#include <tqregexp.h>
#include "qextscintillaapis.h"
// The ctor.
QextScintillaAPIs::QextScintillaAPIs() : sorted(TRUE), ctcursor(0)
{
}
// The dtor.
QextScintillaAPIs::~QextScintillaAPIs()
{
}
// Clear out all API information.
bool QextScintillaAPIs::load(const TQString &fname)
{
TQFile f(fname);
if (!f.open(IO_ReadOnly))
return FALSE;
TQTextStream ts(&f);
for (;;)
{
TQString line = ts.readLine();
if (line.isNull())
break;
apis.append(line);
}
sorted = FALSE;
return TRUE;
}
// Add a single API entry.
void QextScintillaAPIs::add(const TQString &entry)
{
apis.append(entry);
sorted = FALSE;
}
// Clear out all API information.
void QextScintillaAPIs::clear()
{
apis.clear();
sorted = TRUE;
}
// Add auto-completion words to an existing list.
void QextScintillaAPIs::autoCompletionList(const TQString &starts, bool cs,
TQStringList &wlist)
{
ensureSorted();
TQStringList::ConstIterator it = apis.begin();
// Find the first match in the sorted list.
while (it != apis.end())
{
if ((*it).find(starts, 0, cs) == 0)
break;
++it;
}
TQString prev;
while (it != apis.end())
{
if ((*it).find(starts, 0, cs) != 0)
break;
TQString w = (*it).section('(', 0, 0);
if (w != prev)
{
if (wlist.findIndex(w) < 0)
wlist.append(w);
prev = w;
}
++it;
}
}
// Return the call tip for a function.
TQString QextScintillaAPIs::callTips(const TQString &function,int maxnr,
int commas)
{
ensureSorted();
TQStringList::ConstIterator it;
// Find the first match in the sorted list.
for (it = apis.begin(); it != apis.end(); ++it)
if ((*it).startsWith(function))
break;
TQStringList cts;
TQString prev;
while (it != apis.end() && (*it).startsWith(function))
{
if (maxnr > 0 && maxnr == cts.count())
break;
TQString w = *it;
// Remove any image ID used by auto-completion.
w.replace(TQRegExp("\\?[^(]*"),"");
if (w.find('(') == function.length() && w.contains(',') >= commas && w != prev)
{
cts.append(w);
prev = w;
}
++it;
}
// See if we want to add a down arrow.
if (maxnr < 0 && cts.count() > 1)
{
// Remember the state so we can scroll through it later.
ctlist = cts;
ctcursor = 0;
TQString ct = cts[0];
ct.prepend('\002');
return ct;
}
ctlist.clear();
return cts.join("\n");
}
// Return the next or previous call tip.
TQString QextScintillaAPIs::callTipsNextPrev(int dir)
{
TQString ct;
// Get the call tip.
if (dir == 1 && ctcursor > 0)
ct = ctlist[--ctcursor];
else if (dir == 2 && ctcursor < ctlist.count() - 1)
ct = ctlist[++ctcursor];
// Add the arrows.
if (!ct.isNull())
{
if (ctcursor < ctlist.count() - 1)
ct.prepend('\002');
if (ctcursor > 0)
ct.prepend('\001');
}
return ct;
}
// Ensure the list is sorted.
void QextScintillaAPIs::ensureSorted()
{
if (!sorted)
{
apis.sort();
sorted = TRUE;
}
}