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/SciListBox.cpp

329 lines
6.0 KiB

// This module implements the specialisation of TQListBox that handles the
// Scintilla double-click callback.
//
// 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 <stdlib.h>
#include <string.h>
#include <tqapplication.h>
#include <tqmap.h>
#include <tqpixmap.h>
#include "SciListBox.h"
// The platform specific specialisation of the ListBox abstract class.
class ListBoxX : public ListBox
{
public:
ListBoxX();
virtual ~ListBoxX();
CallBackAction cb_action;
void *cb_data;
virtual void SetFont(Font &font);
virtual void Create(Window &parent,int,Point,int,bool);
virtual void SetAverageCharWidth(int);
virtual void SetVisibleRows(int);
virtual int GetVisibleRows() const;
virtual PRectangle GetDesiredRect();
virtual int CaretFromEdge();
virtual void Clear();
virtual void Append(char *s,int type = -1);
virtual int Length();
virtual void Select(int n);
virtual int GetSelection();
virtual int Find(const char *prefix);
virtual void GetValue(int n,char *value,int len);
virtual void Sort();
virtual void RegisterImage(int type,const char *xpm_data);
virtual void ClearRegisteredImages();
virtual void SetDoubleClickAction(CallBackAction action,void *data);
virtual void SetList(const char *list,char separator,char typesep);
private:
SciListBox *slb;
typedef TQMap<int,TQPixmap> xpmMap;
xpmMap xset;
};
ListBoxX::ListBoxX() : cb_action(0), cb_data(0), slb(0)
{
}
ListBoxX::~ListBoxX()
{
}
void ListBoxX::SetFont(Font &font)
{
TQFont *f = reinterpret_cast<TQFont *>(font.GetID());
if (f)
slb -> setFont(*f);
}
void ListBoxX::Create(Window &parent,int,Point,int,bool)
{
// The parent we want is the QextScintillaBase, not the text area.
id = slb = new SciListBox(reinterpret_cast<TQWidget *>(parent.GetID()) -> parentWidget(),this);
}
void ListBoxX::SetAverageCharWidth(int)
{
// We rely on TQListBox::tqsizeHint() for the size of the list box rather
// than make calculations based on the average character width and the
// number of visible rows.
}
void ListBoxX::SetVisibleRows(int)
{
}
int ListBoxX::GetVisibleRows() const
{
return slb -> numItemsVisible();
}
PRectangle ListBoxX::GetDesiredRect()
{
PRectangle rc(0,0,100,100);
if (slb)
{
TQSize sh = slb -> tqsizeHint();
rc.right = sh.width();
rc.bottom = sh.height();
}
return rc;
}
int ListBoxX::CaretFromEdge()
{
int dist = 0;
// Find the width of the biggest image.
for (xpmMap::Iterator it = xset.begin(); it != xset.end(); ++it)
{
int w = it.data().width();
if (dist < w)
dist = w;
}
if (slb)
dist += slb -> frameWidth();
// Fudge factor - adjust if required.
dist += 3;
return dist;
}
void ListBoxX::Clear()
{
slb -> clear();
}
void ListBoxX::Append(char *s,int type)
{
xpmMap::ConstIterator it;
if (type < 0 || (it = xset.find(type)) == xset.end())
slb -> insertItem(s);
else
slb -> insertItem(it.data(),s);
}
int ListBoxX::Length()
{
return (slb ? slb -> numRows() : 0);
}
void ListBoxX::Select(int n)
{
slb -> setSelected(n,TRUE);
}
int ListBoxX::GetSelection()
{
return slb -> currentItem();
}
int ListBoxX::Find(const char *prefix)
{
return slb -> index(slb -> findItem(prefix,TQt::CaseSensitive|TQt::BeginsWith));
}
void ListBoxX::GetValue(int n,char *value,int len)
{
TQString s = slb -> text(n);
if (s.isNull() || len <= 0)
value[0] = '\0';
else
{
strncpy(value,s.latin1(),len - 1);
value[len - 1] = '\0';
}
}
void ListBoxX::Sort()
{
slb -> sort();
}
void ListBoxX::RegisterImage(int type,const char *xpm_data)
{
xset.insert(type,*reinterpret_cast<const TQPixmap *>(xpm_data));
}
void ListBoxX::ClearRegisteredImages()
{
xset.clear();
}
void ListBoxX::SetDoubleClickAction(CallBackAction action,void *data)
{
cb_action = action;
cb_data = data;
}
void ListBoxX::SetList(const char *list,char separator,char typesep)
{
char *words;
Clear();
if ((words = strdup(list)) != NULL)
{
char *startword = words;
char *numword = NULL;
for (int i = 0; words[i] != '\0'; i++)
{
if (words[i] == separator)
{
words[i] = '\0';
if (numword)
*numword = '\0';
Append(startword,numword ? atoi(numword + 1) : -1);
startword = words + i + 1;
numword = NULL;
}
else if (words[i] == typesep)
{
numword = words + i;
}
}
if (startword)
{
if (numword)
*numword = '\0';
Append(startword,numword ? atoi(numword + 1) : -1);
}
free(words);
}
}
// The ListBox methods that need to be implemented explicitly.
ListBox::ListBox()
{
}
ListBox::~ListBox()
{
}
ListBox *ListBox::Allocate()
{
return new ListBoxX();
}
SciListBox::SciListBox(TQWidget *parent,ListBoxX *lbx_)
: TQListBox(parent,0,WType_Popup|WStyle_Customize|WStyle_NoBorder|WStaticContents), lbx(lbx_)
{
setFocusProxy(parent);
setFrameShape(StyledPanel);
setFrameShadow(Plain);
setHScrollBarMode(AlwaysOff);
connect(this,TQT_SIGNAL(doubleClicked(TQListBoxItem *)),
TQT_SLOT(handleDoubleClick(TQListBoxItem *)));
connect(this,TQT_SIGNAL(highlighted(TQListBoxItem *)),
TQT_SLOT(ensureCurrentVisible()));
}
SciListBox::~SciListBox()
{
// Ensure that the main widget doesn't get a focus out event when this
// is destroyed.
setFocusProxy(0);
}
void SciListBox::handleDoubleClick(TQListBoxItem *)
{
if (lbx && lbx -> cb_action)
lbx -> cb_action(lbx -> cb_data);
}