parent
fe6799bb70
commit
fcb7a60156
@ -1,912 +0,0 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
// 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);
|
|
||||||
|
|
||||||
wx_cursor = wxIBEAM_CURSOR;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
// 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;
|
|
||||||
int no_change = 0;
|
|
||||||
|
|
||||||
SetCurrentDC();
|
|
||||||
|
|
||||||
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;
|
|
||||||
case WXK_UP:
|
|
||||||
case WXK_DOWN:
|
|
||||||
no_change = 1;
|
|
||||||
break;
|
|
||||||
case WXK_LEFT:
|
|
||||||
no_change = 1;
|
|
||||||
if (st>0) {
|
|
||||||
st--;
|
|
||||||
TESetSelect(st,st,cMacTE);
|
|
||||||
}
|
|
||||||
if ( (**cMacTE).selRect.right == 1) {
|
|
||||||
if (st!=0) {
|
|
||||||
TEScroll(10,0,cMacTE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case WXK_RIGHT:
|
|
||||||
no_change = 1;
|
|
||||||
if (se<(*cMacTE)->teLength) {
|
|
||||||
se++;
|
|
||||||
TESetSelect(se,se,cMacTE);
|
|
||||||
TESelView(cMacTE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case WXK_HOME:
|
|
||||||
no_change = 1;
|
|
||||||
st = 0;
|
|
||||||
TESetSelect(st,st,cMacTE);
|
|
||||||
break;
|
|
||||||
case WXK_END:
|
|
||||||
no_change = 1;
|
|
||||||
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:
|
|
||||||
no_change = 1;
|
|
||||||
break;
|
|
||||||
case WXK_PAGEDOWN:
|
|
||||||
no_change = 1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
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);
|
|
||||||
|
|
||||||
if (!no_change) {
|
|
||||||
wxCommandEvent *commandEvent = new wxCommandEvent(wxEVENT_TYPE_TEXT_COMMAND);
|
|
||||||
commandEvent->commandString = GetValue();
|
|
||||||
commandEvent->eventObject = this;
|
|
||||||
ProcessCommand(*commandEvent);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
return GetContents();
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
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