commit
879a0546b6
@ -0,0 +1,926 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// File: wx_txt.cc
|
||||||
|
// Purpose: Panel item wxText implementation (Macintosh version)
|
||||||
|
// Author: Bill Hale
|
||||||
|
// Created: 1994
|
||||||
|
// Updated:
|
||||||
|
// Copyright: (c) 1993-94, AIAI, University of Edinburgh. All Rights Reserved.
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
static const char sccsid[] = "%W% %G%";
|
||||||
|
|
||||||
|
#include "wx_item.h"
|
||||||
|
#include "wx_txt.h"
|
||||||
|
#include "wxScroll.h"
|
||||||
|
#include "wx_mac_utils.h"
|
||||||
|
#include "wxMacDC.h"
|
||||||
|
#include "wx_gdi.h"
|
||||||
|
#include "wx_stdev.h"
|
||||||
|
#include "wx_area.h"
|
||||||
|
#include "wxLabelArea.h"
|
||||||
|
#include "wxBorderArea.h"
|
||||||
|
#include "wxMacDC.h"
|
||||||
|
#include "wxScrollArea.h"
|
||||||
|
#include "wx_panel.h"
|
||||||
|
#include "wx_frame.h"
|
||||||
|
#include "wx_text.h"
|
||||||
|
#include "wx_timer.h"
|
||||||
|
#include <QuickDraw.h>
|
||||||
|
#include <Memory.h>
|
||||||
|
|
||||||
|
#define TEXT_MARGIN 2
|
||||||
|
#define DEFAULT_TEXT_WIDTH 60
|
||||||
|
|
||||||
|
extern char *wxBuffer;
|
||||||
|
//=============================================================================
|
||||||
|
// Public constructors
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
static wxText *idleTE;
|
||||||
|
|
||||||
|
class wxTE_Idler : public wxTimer
|
||||||
|
{
|
||||||
|
void Notify() {
|
||||||
|
if (idleTE)
|
||||||
|
idleTE->DoPeriodicAction();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static wxTE_Idler *TE_idler;
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
wxText::wxText // Constructor (given parentPanel)
|
||||||
|
(
|
||||||
|
wxPanel* parentPanel,
|
||||||
|
wxFunction function,
|
||||||
|
char* label,
|
||||||
|
char* value,
|
||||||
|
int x,
|
||||||
|
int y,
|
||||||
|
int width,
|
||||||
|
int height,
|
||||||
|
long style,
|
||||||
|
char* windowName,
|
||||||
|
WXTYPE objectType
|
||||||
|
) :
|
||||||
|
wxbText (parentPanel, x, y, width, height, style, windowName),
|
||||||
|
cTextEditable (TRUE),
|
||||||
|
cTextModified (FALSE)
|
||||||
|
{
|
||||||
|
Callback(function);
|
||||||
|
|
||||||
|
CreateWxText(label, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
wxText::wxText // Constructor (given parentTextWindow)
|
||||||
|
(
|
||||||
|
wxTextWindow* parentTextWindow,
|
||||||
|
wxFunction function,
|
||||||
|
char* label,
|
||||||
|
char* value,
|
||||||
|
int x,
|
||||||
|
int y,
|
||||||
|
int width,
|
||||||
|
int height,
|
||||||
|
long style,
|
||||||
|
char* windowName,
|
||||||
|
WXTYPE objectType
|
||||||
|
) :
|
||||||
|
wxbText (parentTextWindow, x, y, width, height, style, windowName),
|
||||||
|
cTextEditable (TRUE),
|
||||||
|
cTextModified (FALSE)
|
||||||
|
|
||||||
|
{
|
||||||
|
Callback(function);
|
||||||
|
|
||||||
|
CreateWxText(label, value);
|
||||||
|
}
|
||||||
|
//==============
|
||||||
|
// A dummy to satisfy Linkers
|
||||||
|
//
|
||||||
|
wxText::wxText()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
//=============================================================================
|
||||||
|
// Public destructor
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
wxText::~wxText(void)
|
||||||
|
{
|
||||||
|
DestroyFocus(); // tom: just to be sure
|
||||||
|
if (cMacTE)
|
||||||
|
::TEDispose(cMacTE);
|
||||||
|
|
||||||
|
if (TE_idler && (idleTE == this)) {
|
||||||
|
idleTE == NULL;
|
||||||
|
TE_idler->Stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
// Private methods
|
||||||
|
//=============================================================================
|
||||||
|
|
||||||
|
void wxText::CreateWxText(char* label, char* value) // common constructor initialization
|
||||||
|
{
|
||||||
|
SetEraser(NULL);
|
||||||
|
|
||||||
|
if (label)
|
||||||
|
label = wxItemStripLabel(label);
|
||||||
|
|
||||||
|
//////////////////////////////////////////
|
||||||
|
// do platform stuff:
|
||||||
|
//////////////////////////////////////////
|
||||||
|
if (!buttonFont)
|
||||||
|
buttonFont = wxNORMAL_FONT;
|
||||||
|
if (!labelFont)
|
||||||
|
labelFont = wxNORMAL_FONT;
|
||||||
|
|
||||||
|
SetCurrentMacDC();
|
||||||
|
CGrafPtr theMacGrafPort = cMacDC->macGrafPort();
|
||||||
|
|
||||||
|
float tWidth, tHeight;
|
||||||
|
float lWidth, lHeight;
|
||||||
|
GetTextExtent("X", &tWidth, &tHeight, NULL, NULL, buttonFont);
|
||||||
|
GetTextExtent(label ? label : "X", &lWidth, &lHeight, NULL, NULL, labelFont);
|
||||||
|
|
||||||
|
int clientHeight = ClientArea()->Height();
|
||||||
|
if (clientHeight <= 0) {
|
||||||
|
int lblh = (label && (labelPosition == wxVERTICAL) ? (int)lHeight : 0);
|
||||||
|
clientHeight = cWindowHeight = (int)tHeight + 2 * TEXT_MARGIN + 2; // +2 for border
|
||||||
|
cWindowHeight = clientHeight + lblh;
|
||||||
|
}
|
||||||
|
int clientWidth = ClientArea()->Width();
|
||||||
|
if (clientWidth <= 0) {
|
||||||
|
int lblw = (label && (labelPosition != wxVERTICAL) ? (int)lWidth : 0);
|
||||||
|
clientWidth = DEFAULT_TEXT_WIDTH + (2 * TEXT_MARGIN) + 2; // +2 for border
|
||||||
|
cWindowWidth = clientWidth + lblw;
|
||||||
|
}
|
||||||
|
Rect destRect = {TEXT_MARGIN, TEXT_MARGIN,
|
||||||
|
clientHeight - TEXT_MARGIN, clientWidth - TEXT_MARGIN};
|
||||||
|
cMacTE = ::TENew(&destRect, &destRect);
|
||||||
|
CheckMemOK(cMacTE);
|
||||||
|
|
||||||
|
SetFont(buttonFont);
|
||||||
|
HLock((Handle)cMacTE);
|
||||||
|
(*cMacTE)->crOnly = -1;
|
||||||
|
HUnlock((Handle)cMacTE);
|
||||||
|
// tom (fettig@dfki.uni-sb.de)
|
||||||
|
// True single line Mode!
|
||||||
|
::TEAutoView(TRUE,cMacTE);
|
||||||
|
|
||||||
|
//////////////////////////////////////////
|
||||||
|
// do more wxWindow stuff:
|
||||||
|
//////////////////////////////////////////
|
||||||
|
if (cStyle & wxVSCROLL || cStyle & wxHSCROLL)
|
||||||
|
{
|
||||||
|
wxScrollData* scrollData = new wxScrollData;
|
||||||
|
#if 0 // mflatt: Hello didn't run with "1"
|
||||||
|
new wxScrollArea(this, this, (cStyle & wxVSCROLL) | (cStyle & wxHSCROLL));
|
||||||
|
#else
|
||||||
|
cScroll = new wxScroll(this, scrollData);
|
||||||
|
if (cStyle & wxVSCROLL) new wxScrollArea(this, this, wxVSCROLL);
|
||||||
|
if (cStyle & wxHSCROLL) new wxScrollArea(this, this, wxHSCROLL);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// mflatt: text should always have a border
|
||||||
|
#if 0
|
||||||
|
if (cStyle & wxBORDER)
|
||||||
|
#endif
|
||||||
|
new wxBorderArea(this);
|
||||||
|
|
||||||
|
if (label)
|
||||||
|
{
|
||||||
|
cLabelArea = new wxLabelArea(this, label, labelFont,
|
||||||
|
labelPosition == wxVERTICAL ? Direction::wxTop : Direction::wxLeft,
|
||||||
|
0,
|
||||||
|
labelPosition == wxVERTICAL ? 0 : 1 + TEXT_MARGIN);
|
||||||
|
}
|
||||||
|
else cLabelArea = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
if (value)
|
||||||
|
{
|
||||||
|
SetValue(value);
|
||||||
|
cTextModified = FALSE; // kludge
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (GetParent()->IsHidden())
|
||||||
|
DoShow(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// Other methods
|
||||||
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::WriteText(char* text)
|
||||||
|
{
|
||||||
|
SetCurrentDC();
|
||||||
|
long endPosition = (**cMacTE).teLength;
|
||||||
|
::TESetSelect(endPosition, endPosition, cMacTE);
|
||||||
|
::TEInsert(text, strlen(text), cMacTE);
|
||||||
|
macAdjustScrollBars();
|
||||||
|
cTextModified = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::Clear(void)
|
||||||
|
{
|
||||||
|
SetCurrentDC();
|
||||||
|
long endPosition = (**cMacTE).teLength;
|
||||||
|
::TESetSelect(0, endPosition, cMacTE);
|
||||||
|
::TEDelete(cMacTE);
|
||||||
|
macAdjustScrollBars();
|
||||||
|
cTextModified = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
Bool wxText::Modified(void) { return cTextModified; }
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::SetModified(Bool modified) // mac platform only
|
||||||
|
{
|
||||||
|
cTextModified = modified;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Not clear whether Clear is required as well as DiscardEdits
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::DiscardEdits(void)
|
||||||
|
{
|
||||||
|
SetCurrentDC();
|
||||||
|
long endPosition = (**cMacTE).teLength;
|
||||||
|
::TESetSelect(0, endPosition, cMacTE);
|
||||||
|
::TEDelete(cMacTE);
|
||||||
|
macAdjustScrollBars();
|
||||||
|
cTextModified = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::SetEditable(Bool editable) { cTextEditable = editable; }
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
char* wxText::GetContents(void)
|
||||||
|
{
|
||||||
|
CharsHandle theMacText = ::TEGetText(cMacTE);
|
||||||
|
int theMacTextLength = (**cMacTE).teLength;
|
||||||
|
char* result = new char[theMacTextLength + 1];
|
||||||
|
BlockMove(*theMacText, result, theMacTextLength);
|
||||||
|
result[theMacTextLength] = 0; // terminate "C" string
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::SetInsertionPoint(long pos)
|
||||||
|
{
|
||||||
|
SetCurrentDC();
|
||||||
|
::TESetSelect(pos, pos, cMacTE);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::SetInsertionPointEnd(void)
|
||||||
|
{
|
||||||
|
SetCurrentDC();
|
||||||
|
long endPosition = (**cMacTE).teLength;
|
||||||
|
::TESetSelect(endPosition, endPosition, cMacTE);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
long wxText::GetInsertionPoint(void) { return (**cMacTE).selStart; }
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
long wxText::GetLastPosition(void) { return (**cMacTE).teLength; }
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
long wxText::XYToPosition(long x, long y) // x is char pos, y is line number?
|
||||||
|
{
|
||||||
|
long numberOfLines = GetNumberOfLines();
|
||||||
|
|
||||||
|
if (y >= numberOfLines || y < 0) return 0;
|
||||||
|
|
||||||
|
long startPos = (**cMacTE).lineStarts[y];
|
||||||
|
|
||||||
|
return startPos + x;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::PositionToXY(long* x, long* y) // counting from 0
|
||||||
|
{
|
||||||
|
long thePosition = GetInsertionPoint();
|
||||||
|
long numberOfLines = GetNumberOfLines();
|
||||||
|
|
||||||
|
long theY = -1;
|
||||||
|
long lineAt = numberOfLines - 1; // counting from 0
|
||||||
|
while (lineAt >= 0 && theY == -1) // count down to 0
|
||||||
|
{
|
||||||
|
if (thePosition < (**cMacTE).lineStarts[lineAt])
|
||||||
|
lineAt--; // count down to 0
|
||||||
|
else theY = lineAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (theY != -1)
|
||||||
|
{
|
||||||
|
*x = thePosition - (**cMacTE).lineStarts[theY]; // counting from 0
|
||||||
|
*y = theY; // counting from 0
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*x = 0;
|
||||||
|
*y = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::ShowPosition(long pos)
|
||||||
|
{
|
||||||
|
#ifdef wx_motif
|
||||||
|
Widget textWidget = (Widget)handle;
|
||||||
|
XmTextShowPosition(textWidget, (XmTextPosition)pos);
|
||||||
|
#endif
|
||||||
|
#ifdef wx_xview
|
||||||
|
Textsw textsw = (Textsw)handle;
|
||||||
|
|
||||||
|
xv_set(textsw, TEXTSW_FIRST, (Textsw_index)pos, NULL);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
int wxText::GetLineLength(long lineNo) // lineNo starts at zero
|
||||||
|
{
|
||||||
|
long numberOfLines = GetNumberOfLines();
|
||||||
|
|
||||||
|
if (lineNo >= numberOfLines || lineNo < 0) return 0;
|
||||||
|
|
||||||
|
long startPos = (**cMacTE).lineStarts[lineNo];
|
||||||
|
|
||||||
|
long nextLineNo = lineNo + 1;
|
||||||
|
long nextStartPos;
|
||||||
|
if (nextLineNo < numberOfLines)
|
||||||
|
nextStartPos = (**cMacTE).lineStarts[nextLineNo];
|
||||||
|
else nextStartPos = (**cMacTE).teLength;
|
||||||
|
|
||||||
|
return nextStartPos - startPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
int wxText::GetNumberOfLines(void) { return (**cMacTE).nLines; }
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
int wxText::GetLineText(long lineNo, char* buf) // WCH: THIS ALLOCATES buf!!!
|
||||||
|
{
|
||||||
|
int length; // lenght of text returned in buf
|
||||||
|
long numberOfLines = GetNumberOfLines();
|
||||||
|
|
||||||
|
if (lineNo >= numberOfLines || lineNo < 0)
|
||||||
|
{
|
||||||
|
length = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
long startPos = (**cMacTE).lineStarts[lineNo];
|
||||||
|
|
||||||
|
long nextLineNo = lineNo + 1;
|
||||||
|
long nextStartPos;
|
||||||
|
if (nextLineNo < numberOfLines)
|
||||||
|
nextStartPos = (**cMacTE).lineStarts[nextLineNo];
|
||||||
|
else nextStartPos = (**cMacTE).teLength;
|
||||||
|
length = nextStartPos - startPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf = new char[length + 1]; // WCH: THIS ALLOCATES buf!!!
|
||||||
|
CharsHandle theMacText = ::TEGetText(cMacTE);
|
||||||
|
BlockMove(*theMacText, buf, length); // BlockMove allows args to overlap
|
||||||
|
buf[length] = 0; // terminate "C" string
|
||||||
|
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::Replace(long from, long to, char* value)
|
||||||
|
{
|
||||||
|
SetCurrentDC();
|
||||||
|
::TESetSelect(from, to, cMacTE);
|
||||||
|
::TEDelete(cMacTE); // doesn't copy selected text to scrap
|
||||||
|
::TEInsert(value, strlen(value), cMacTE);
|
||||||
|
macAdjustScrollBars();
|
||||||
|
cTextModified = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::Remove(long from, long to)
|
||||||
|
{
|
||||||
|
SetCurrentDC();
|
||||||
|
::TESetSelect(from, to, cMacTE);
|
||||||
|
::TECut(cMacTE); // does copy selected text to scrap
|
||||||
|
macAdjustScrollBars();
|
||||||
|
cTextModified = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::Highlight(long from, long to)
|
||||||
|
{
|
||||||
|
SetCurrentDC();
|
||||||
|
::TESetSelect(from, to, cMacTE);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::Paint(void)
|
||||||
|
{
|
||||||
|
if (cHidden) return;
|
||||||
|
|
||||||
|
SetCurrentDC();
|
||||||
|
Rect viewRect = (**cMacTE).viewRect;
|
||||||
|
Rect whiteRect = viewRect;
|
||||||
|
InsetRect(&whiteRect, -TEXT_MARGIN, -TEXT_MARGIN);
|
||||||
|
::EraseRect(&whiteRect);
|
||||||
|
::TEUpdate(&viewRect, cMacTE);
|
||||||
|
|
||||||
|
wxWindow::Paint();
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::DoShow(Bool show)
|
||||||
|
{
|
||||||
|
wxWindow::DoShow(show);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::DoPeriodicAction(void) // mac platform only
|
||||||
|
{
|
||||||
|
SetCurrentDC();
|
||||||
|
::TEIdle(cMacTE);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::OnChar(wxKeyEvent& event) // mac platform only
|
||||||
|
{
|
||||||
|
long st,se;
|
||||||
|
|
||||||
|
HLock((Handle)cMacTE);
|
||||||
|
st = (*cMacTE)->selStart;
|
||||||
|
se = (*cMacTE)->selEnd;
|
||||||
|
if (cEnable)
|
||||||
|
{
|
||||||
|
// GRW:
|
||||||
|
// wxText is really meant to be a single line input, which means that it can be used
|
||||||
|
// in dialogs and still have enter/return trigger the dialog's default action. Since
|
||||||
|
// wxMultiText and wxTextWindow count on wxText supporting multiple lines, however,
|
||||||
|
// an expedient hack was to preserve this behavior when wxMULTIPLE is specified.
|
||||||
|
// Note that I haven't done all of the grunge to make wxText properly behave as a
|
||||||
|
// single line input (lines still wrap).
|
||||||
|
|
||||||
|
// lets implement the single line mode - tom (fettig@dfki.uni-sb.de)
|
||||||
|
char code = event.keyCode;
|
||||||
|
|
||||||
|
switch (event.keyCode)
|
||||||
|
{
|
||||||
|
case 0x03: // enter
|
||||||
|
case 0x0D: // return
|
||||||
|
case 0x09: // tab
|
||||||
|
if (cStyle & wxPROCESS_ENTER) {
|
||||||
|
wxCommandEvent *command = new wxCommandEvent(wxEVENT_TYPE_TEXT_ENTER_COMMAND);
|
||||||
|
command->eventObject = this;
|
||||||
|
ProcessCommand(*command);
|
||||||
|
} else if (!(cStyle & wxMULTIPLE)) {
|
||||||
|
wxItem::OnChar(event);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#if 0 // tom replaces:
|
||||||
|
case WXK_UP:
|
||||||
|
code = 30;
|
||||||
|
break;
|
||||||
|
case WXK_DOWN:
|
||||||
|
code = 31;
|
||||||
|
break;
|
||||||
|
case WXK_LEFT:
|
||||||
|
code = 28;
|
||||||
|
break;
|
||||||
|
case WXK_RIGHT:
|
||||||
|
code = 29;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetCurrentDC();
|
||||||
|
::TEKey(code, cMacTE);
|
||||||
|
macAdjustScrollBars();
|
||||||
|
cTextModified = TRUE;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
case WXK_UP:
|
||||||
|
case WXK_DOWN:
|
||||||
|
break;
|
||||||
|
case WXK_LEFT:
|
||||||
|
if (st>0) {
|
||||||
|
st--;
|
||||||
|
TESetSelect(st,st,cMacTE);
|
||||||
|
}
|
||||||
|
if ( (**cMacTE).selRect.right == 1) {
|
||||||
|
if (st!=0) {
|
||||||
|
TEScroll(10,0,cMacTE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WXK_RIGHT:
|
||||||
|
if (se<(*cMacTE)->teLength) {
|
||||||
|
se++;
|
||||||
|
TESetSelect(se,se,cMacTE);
|
||||||
|
TESelView(cMacTE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WXK_HOME:
|
||||||
|
st = 0;
|
||||||
|
TESetSelect(st,st,cMacTE);
|
||||||
|
break;
|
||||||
|
case WXK_END:
|
||||||
|
se = (*cMacTE)->teLength;
|
||||||
|
TESetSelect(se,se,cMacTE);
|
||||||
|
break;
|
||||||
|
case WXK_DELETE:
|
||||||
|
if (se==st) {
|
||||||
|
if (se < (*cMacTE)->teLength) {
|
||||||
|
se++;
|
||||||
|
TESetSelect(st,se,cMacTE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
TEDelete(cMacTE);
|
||||||
|
break;
|
||||||
|
case WXK_PAGEUP:
|
||||||
|
break;
|
||||||
|
case WXK_PAGEDOWN:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
SetCurrentDC(); // tom: I am not sure about this call...
|
||||||
|
char theChar = event.keyCode;
|
||||||
|
::TEKey(theChar, cMacTE);
|
||||||
|
//macAdjustScrollBars();
|
||||||
|
cTextModified = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
macAdjustScrollBars();
|
||||||
|
}
|
||||||
|
if ( ((**cMacTE).viewRect.right-1) <= (**cMacTE).selRect.right) {
|
||||||
|
TEScroll(-10,0,cMacTE);
|
||||||
|
}
|
||||||
|
HUnlock((Handle)cMacTE);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::OnEvent(wxMouseEvent& event) // WCH: mac only ?
|
||||||
|
{
|
||||||
|
if (cEnable)
|
||||||
|
{
|
||||||
|
if (event.LeftDown())
|
||||||
|
{
|
||||||
|
// SetFocus(); // mflatt: no longer needed
|
||||||
|
|
||||||
|
float fStartH, fStartV;
|
||||||
|
event.Position(&fStartH, &fStartV); // client c.s.
|
||||||
|
int startH = fStartH;
|
||||||
|
int startV = fStartV;
|
||||||
|
|
||||||
|
SetCurrentDC();
|
||||||
|
Point startPt = {startV, startH}; // client c.s.
|
||||||
|
Bool extendSelection = event.shiftDown;
|
||||||
|
::TEClick(startPt, extendSelection, cMacTE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::SetTextInfo(void) // mac platform only
|
||||||
|
{
|
||||||
|
int oldTxFont = (**cMacTE).txFont;
|
||||||
|
int oldTxSize = (**cMacTE).txSize;
|
||||||
|
Style oldTxFace = (**cMacTE).txFace;
|
||||||
|
int newTxFont;
|
||||||
|
int newTxSize;
|
||||||
|
Style newTxFace;
|
||||||
|
|
||||||
|
if (!font)
|
||||||
|
{
|
||||||
|
newTxFont = 1;
|
||||||
|
newTxSize = 12;
|
||||||
|
newTxFace = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
newTxFont = font->GetMacFontNum();
|
||||||
|
newTxSize = font->GetPointSize();
|
||||||
|
newTxFace = font->GetMacFontStyle();
|
||||||
|
}
|
||||||
|
|
||||||
|
(**cMacTE).txFont = newTxFont;
|
||||||
|
(**cMacTE).txSize = newTxSize;
|
||||||
|
(**cMacTE).txFace = newTxFace;
|
||||||
|
|
||||||
|
if (newTxFont != oldTxFont || newTxSize != oldTxSize || newTxFace != oldTxFace)
|
||||||
|
{
|
||||||
|
::TECalText(cMacTE);
|
||||||
|
Rect theViewRect = (**cMacTE).viewRect;
|
||||||
|
::InvalRect(&theViewRect);
|
||||||
|
::EraseRect(&theViewRect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::SetFont(wxFont* theFont) // mac platform only
|
||||||
|
{
|
||||||
|
SetCurrentMacDC();
|
||||||
|
|
||||||
|
font = theFont;
|
||||||
|
|
||||||
|
int oldTxFont = (**cMacTE).txFont;
|
||||||
|
int oldTxSize = (**cMacTE).txSize;
|
||||||
|
Style oldTxFace = (**cMacTE).txFace;
|
||||||
|
int newTxFont;
|
||||||
|
int newTxSize;
|
||||||
|
Style newTxFace;
|
||||||
|
int newLineHeight; // WCH: 94/12/26
|
||||||
|
int newFontAscent; // WCH: 94/12/26
|
||||||
|
|
||||||
|
if (!font)
|
||||||
|
{
|
||||||
|
newTxFont = 1;
|
||||||
|
newTxSize = 12;
|
||||||
|
newTxFace = 0;
|
||||||
|
newLineHeight = 16; // WCH: 94/12/26
|
||||||
|
newFontAscent = 12; // WCH: 94/12/26
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
newTxFont = font->GetMacFontNum();
|
||||||
|
newTxSize = font->GetPointSize();
|
||||||
|
newTxFace = font->GetMacFontStyle();
|
||||||
|
|
||||||
|
float theWidth; // WCH: 94/12/26
|
||||||
|
float theLineHeight; // WCH: 94/12/26
|
||||||
|
float theDescent; // WCH: 94/12/26
|
||||||
|
float theExternalLeading; // WCH: 94/12/26
|
||||||
|
font->GetTextExtent("W", &theWidth, &theLineHeight,
|
||||||
|
&theDescent, &theExternalLeading); // WCH: 94/12/26
|
||||||
|
newLineHeight = theLineHeight; // WCH: 94/12/26
|
||||||
|
newFontAscent = theLineHeight - theDescent - theExternalLeading; // WCH: 94/12/26
|
||||||
|
}
|
||||||
|
|
||||||
|
(**cMacTE).txFont = newTxFont;
|
||||||
|
(**cMacTE).txSize = newTxSize;
|
||||||
|
(**cMacTE).txFace = newTxFace;
|
||||||
|
|
||||||
|
(**cMacTE).lineHeight = newLineHeight; // WCH: 94/12/26
|
||||||
|
(**cMacTE).fontAscent = newFontAscent; // WCH: 94/12/26
|
||||||
|
|
||||||
|
if (newTxFont != oldTxFont || newTxSize != oldTxSize || newTxFace != oldTxFace)
|
||||||
|
{
|
||||||
|
::TECalText(cMacTE);
|
||||||
|
Rect theViewRect = (**cMacTE).viewRect;
|
||||||
|
::InvalRect(&theViewRect);
|
||||||
|
::EraseRect(&theViewRect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::SetLabel(char* label)
|
||||||
|
{
|
||||||
|
if (cLabelArea) cLabelArea->SetLabel(label);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
char* wxText::GetLabel(void)
|
||||||
|
{
|
||||||
|
return (cLabelArea ? cLabelArea->GetLabel() : NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
char* wxText::GetValue(void)
|
||||||
|
{
|
||||||
|
CharsHandle theMacText = ::TEGetText(cMacTE);
|
||||||
|
int theMacTextLength = (**cMacTE).teLength;
|
||||||
|
#if 1 // CJC
|
||||||
|
char *result = wxBuffer;
|
||||||
|
#else
|
||||||
|
char* result = new char[theMacTextLength + 1];
|
||||||
|
#endif
|
||||||
|
BlockMove(*theMacText, result, theMacTextLength);
|
||||||
|
result[theMacTextLength] = 0; // terminate "C" string
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::SetValue(char* value)
|
||||||
|
{
|
||||||
|
SetCurrentDC();
|
||||||
|
long endPosition = (**cMacTE).teLength;
|
||||||
|
::TESetSelect(0, endPosition, cMacTE);
|
||||||
|
::TEDelete(cMacTE); // doesn't copy selected text to scrap
|
||||||
|
::TEInsert(value, strlen(value), cMacTE);
|
||||||
|
macAdjustScrollBars();
|
||||||
|
cTextModified = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//=============================================================================
|
||||||
|
void wxText::ChangeColour(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// Activate methods
|
||||||
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::OnSetFocus()
|
||||||
|
{
|
||||||
|
if (cHidden) return;
|
||||||
|
|
||||||
|
SetCurrentDC();
|
||||||
|
// The following is a kludge, to prevent flicker during subsequent update event
|
||||||
|
Rect viewRect = (**cMacTE).viewRect;
|
||||||
|
::TEUpdate(&viewRect, cMacTE);
|
||||||
|
::TEActivate(cMacTE); // This is the "ShowAsActive" part
|
||||||
|
::ValidRect(&viewRect);
|
||||||
|
|
||||||
|
if (!idleTE) {
|
||||||
|
if (!TE_idler)
|
||||||
|
TE_idler = new wxTE_Idler;
|
||||||
|
TE_idler->Start();
|
||||||
|
}
|
||||||
|
idleTE = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::OnKillFocus()
|
||||||
|
{
|
||||||
|
SetCurrentDC();
|
||||||
|
::TEDeactivate(cMacTE);
|
||||||
|
|
||||||
|
if (TE_idler && (idleTE == this)) {
|
||||||
|
idleTE == NULL;
|
||||||
|
TE_idler->Stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// Scroll methods
|
||||||
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::macAdjustScrollBars(void) // mac platform only
|
||||||
|
{
|
||||||
|
if (cScroll)
|
||||||
|
{
|
||||||
|
wxWhatScrollData whatScrollData; // track what scrolldata changes
|
||||||
|
wxScrollData* oldScrollData = cScroll->GetScrollData();
|
||||||
|
wxScrollData scrollData;
|
||||||
|
if (oldScrollData) scrollData = *oldScrollData;
|
||||||
|
|
||||||
|
int maxTop = GetNumberOfLines();
|
||||||
|
if (maxTop != scrollData.GetValue(wxWhatScrollData::wxSizeH))
|
||||||
|
{
|
||||||
|
scrollData.SetValue(maxTop, wxWhatScrollData::wxSizeH);
|
||||||
|
whatScrollData |= wxWhatScrollData::wxSizeH;
|
||||||
|
}
|
||||||
|
|
||||||
|
int units_per_scroll_x = 1;
|
||||||
|
if (units_per_scroll_x != scrollData.GetValue(wxWhatScrollData::wxUnitW))
|
||||||
|
{
|
||||||
|
scrollData.SetValue(units_per_scroll_x, wxWhatScrollData::wxUnitW);
|
||||||
|
whatScrollData |= wxWhatScrollData::wxUnitW;
|
||||||
|
}
|
||||||
|
|
||||||
|
int scrolls_per_page_x = 1;
|
||||||
|
if (scrolls_per_page_x != scrollData.GetValue(wxWhatScrollData::wxPageW))
|
||||||
|
{
|
||||||
|
scrollData.SetValue(scrolls_per_page_x, wxWhatScrollData::wxPageW);
|
||||||
|
whatScrollData |= wxWhatScrollData::wxPageW;
|
||||||
|
}
|
||||||
|
|
||||||
|
int charHeight = GetCharHeight();
|
||||||
|
int units_per_scroll_y = (charHeight > 0 ? charHeight : 1);
|
||||||
|
if (units_per_scroll_y != scrollData.GetValue(wxWhatScrollData::wxUnitH))
|
||||||
|
{
|
||||||
|
scrollData.SetValue(units_per_scroll_y, wxWhatScrollData::wxUnitH);
|
||||||
|
whatScrollData |= wxWhatScrollData::wxUnitH;
|
||||||
|
}
|
||||||
|
|
||||||
|
int clientHeight = ClientArea()->Height();
|
||||||
|
int scrolls_per_page_y = (charHeight > 0 ? clientHeight / charHeight : 1);
|
||||||
|
if (scrolls_per_page_y != scrollData.GetValue(wxWhatScrollData::wxPageH))
|
||||||
|
{
|
||||||
|
scrollData.SetValue(scrolls_per_page_y, wxWhatScrollData::wxPageH);
|
||||||
|
whatScrollData |= wxWhatScrollData::wxPageH;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((long)whatScrollData != 0)
|
||||||
|
cScroll->SetScrollData(&scrollData, whatScrollData, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::SetScrollData // adjust text within window to match scroll bar setting
|
||||||
|
(
|
||||||
|
wxScrollData* newScrollData,
|
||||||
|
wxWhatScrollData whatScrollData,
|
||||||
|
wxWindow* iniatorWindow
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (iniatorWindow == this) return;
|
||||||
|
|
||||||
|
Bool isNewPositionH = (long)whatScrollData & wxWhatScrollData::wxPositionH;
|
||||||
|
Bool isNewPositionV = (long)whatScrollData & wxWhatScrollData::wxPositionV;
|
||||||
|
|
||||||
|
if (isNewPositionH || isNewPositionV)
|
||||||
|
{
|
||||||
|
SetCurrentDC();
|
||||||
|
Rect viewRect = (**cMacTE).viewRect;
|
||||||
|
Rect destRect = (**cMacTE).destRect;
|
||||||
|
int oldH = viewRect.left - destRect.left;
|
||||||
|
int oldV = viewRect.top - destRect.top;
|
||||||
|
|
||||||
|
int dH = 0;
|
||||||
|
if (isNewPositionH)
|
||||||
|
{
|
||||||
|
int newH = newScrollData->GetValue(wxWhatScrollData::wxPositionH) *
|
||||||
|
newScrollData->GetValue(wxWhatScrollData::wxUnitW);
|
||||||
|
dH = newH - oldH;
|
||||||
|
}
|
||||||
|
|
||||||
|
int dV = 0;
|
||||||
|
if (isNewPositionV)
|
||||||
|
{
|
||||||
|
int newV = newScrollData->GetValue(wxWhatScrollData::wxPositionV) *
|
||||||
|
newScrollData->GetValue(wxWhatScrollData::wxUnitH);
|
||||||
|
dV = newV - oldV;
|
||||||
|
}
|
||||||
|
|
||||||
|
::TEScroll(-dH, -dV, cMacTE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
// Sizing methods
|
||||||
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void wxText::OnClientAreaDSize(int dW, int dH, int dX, int dY)
|
||||||
|
{
|
||||||
|
SetCurrentDC();
|
||||||
|
|
||||||
|
int clientWidth = ClientArea()->Width();
|
||||||
|
int clientHeight= ClientArea()->Height();
|
||||||
|
|
||||||
|
Rect newDestRect = {TEXT_MARGIN, TEXT_MARGIN,
|
||||||
|
clientHeight - TEXT_MARGIN, clientWidth - TEXT_MARGIN};
|
||||||
|
(**cMacTE).viewRect = newDestRect;
|
||||||
|
(**cMacTE).destRect = newDestRect;
|
||||||
|
// must let platform recalculate any line changes:
|
||||||
|
if (dW || dH)
|
||||||
|
{
|
||||||
|
::TECalText(cMacTE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dX || dY)
|
||||||
|
{
|
||||||
|
cMacDC->setCurrentUser(NULL); // macDC no longer valid
|
||||||
|
SetCurrentDC(); // put newViewRect at (0, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
::InvalRect(&newDestRect); // force redraw of text window
|
||||||
|
::EraseRect(&newDestRect);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cut, copy, paste
|
||||||
|
void wxText::Copy()
|
||||||
|
{
|
||||||
|
::TECopy(cMacTE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxText::Paste()
|
||||||
|
{
|
||||||
|
::TEPaste(cMacTE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxText::Cut()
|
||||||
|
{
|
||||||
|
::TECut(cMacTE);
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool wxText::WantsFocus()
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxText::ChangeToGray(Bool gray)
|
||||||
|
{
|
||||||
|
ChildrenInternalGray(gray);
|
||||||
|
wxWindow::ChangeToGray(gray);
|
||||||
|
}
|
Loading…
Reference in New Issue