📄 textfieldpopup.java
字号:
breakOffset++;
textW += f.charWidth(c);
}
if (niceB > offset && niceB < offset + len - 2 && (text[niceB + 1] == ' '))
return niceB + 2; // case: special case to get rid of extra spaces
else if (niceB > offset && niceB < offset + len)
return niceB + 1; // case: found a nice break, use this
else if (breakOffset > offset + 1)
return breakOffset - 1; // case: broke due to text width too big
else if (breakOffset == offset)
return breakOffset + 1; // case: broken on first char, step one more
else
return breakOffset; // case: default
}
/**
* Paints the popup. Call this from your <code>Displayable</code>'s
* paint method.
*
* @param g Graphics context to paint on.
*/
public void paint(Graphics g)
{
System.out.println("enter TextFieldPopup::paint");
try
{
if (m_active)
{
/*m_display.setCurrent(
new Alert(
"提示",
"Popup>>1",
null, AlertType.ERROR));
Thread.sleep(2000);*/
// draw transparent background
for (int y = OFFSET_POPUP + m_yoffset; y < OFFSET_POPUP + m_yoffset + m_h; y += 8)
{
/*
* Math.min(8,OFFSET_POPUP + m_yoffset + m_h - y)
在CLDC1.0下无法运行,所以必须修改.
zhengyun 20051216
*/
int nTemp = OFFSET_POPUP + m_yoffset + m_h - y;
nTemp = 8>nTemp ? nTemp:8;
g.drawRGB(m_rgbData, 0, m_w, OFFSET_POPUP, y, m_w, nTemp, true);
}
// border
g.setColor(m_borderColor);
g.drawRect(OFFSET_POPUP, OFFSET_POPUP + m_yoffset, m_w, m_h);
/*System.out.println("OFFSET_POPUP=" + OFFSET_POPUP +
";m_yoffset=" + m_yoffset +
";m_w=" + m_w +
";m_h=" +m_h);*/
////////////////////////////////////////////////////////////////////////
/*
* zhengyun 20051220
* 尝试画一个文本输入框;
*/
// drawRect(int x, int y, int width, int height)
g.setColor(m_borderColor);
g.drawRect(OFFSET_POPUP + 2, OFFSET_POPUP + m_yoffset + 1, m_w - 5,
m_fontHeight - 1);
g.setColor(m_textColor);
g.drawRect(OFFSET_POPUP + 3, OFFSET_POPUP + m_yoffset + 2, m_w - 6,
m_fontHeight - 2);
// 绘制编辑框内的背景色,稍微浅色点
for (int y = OFFSET_POPUP + m_yoffset + 2;
y < OFFSET_POPUP + m_yoffset + m_fontHeight - 1; y += 4)
{
int nTemp = OFFSET_POPUP + m_yoffset + m_fontHeight - y;
nTemp = 4>nTemp ? nTemp:4;
// public void drawRGB(int[] rgbData, int offset, int scanlength, int x, int y, int
// width, int height, boolean processAlpha).
g.drawRGB(m_rgbTextFieldData, 0, m_w - 6,
OFFSET_POPUP + 3, y, m_w - 6, nTemp, true);
}
// getFormattedText返回的char数组总是最大限制输入数值个字符的长度,而不是用户输入的字符的长度
char[] text = getFormattedText(SCROLLABLE);
// 所以必须截断:
String strText = String.valueOf(text).trim();
int cursorOffset = calculatedCursorOffset;
int caretPosition = calculatedCaretPosition;
int curLen = currentLength;
if (strText.length() != 0) {
System.out.println("getFormattedText>>" + strText);
// drawChars(char[] data,int offset,int length,int x,int y,int anchor)
g.setColor(m_selectedAlternativeColor);
g.setFont(m_font);
int nCharWidth =
m_font.charsWidth(strText.toCharArray(), 0, strText.length()) >> 1;
int nEditX = OFFSET_POPUP + OFFSET_TEXT +
(m_w / (m_alternatives + 1))
- nCharWidth;
g.drawChars(text, 0, text.length,
nEditX, OFFSET_POPUP + m_yoffset + m_fontHeight + 1,
Graphics.BOTTOM | Graphics.LEFT);
}
//
//////////////////////////////////////////////////////////////////////////
// text
g.setColor(m_textColor);
g.setFont(m_font);
//int y = OFFSET_POPUP + OFFSET_TEXT + m_yoffset;
int y = OFFSET_POPUP + OFFSET_TEXT + m_yoffset + m_fontHeight + 2;
/*
* Math.min(m_curLine + m_visibleLines, m_breakTextData.length)
* 不能在CLDC1.0上运行.
* zhengyun 20051216
*/
int nTemp1 = m_curLine + m_visibleLines;
int nTemp2 = m_breakTextData.length;
int maxLine =
nTemp1 > nTemp2 ? nTemp2 : nTemp1;
for (int i = m_curLine; i < maxLine; i++)
{
int offset = m_breakTextData[i][0];
int len = m_breakTextData[i][1];
if (len == 1 && m_text[offset] == NEWLINE)
{
y += m_fontHeight;
}
else
{
if (m_text[offset + len - 1] == NEWLINE)
{
len--;
}
g.drawChars(m_text, offset, len, OFFSET_POPUP + OFFSET_TEXT
+ (m_w >> 1), y, Graphics.TOP | Graphics.HCENTER);
y += m_fontHeight;
}
}
// scrollbar
if (m_visibleLines < m_breakTextData.length)
{
int sbh = m_visibleLines * m_fontHeight; // Scrollbar max height
int sbstep = ((sbh - 4) << 8) / m_maxLine; // Scrollbar height * 256
int sbX =
OFFSET_POPUP + m_w - SB_WIDTH - (SB_WIDTH >> 1); // Scrollbar x-coordinate
g.setColor(m_textColor);
g.fillRect(sbX, OFFSET_POPUP + OFFSET_TEXT + ((m_curLine * sbstep) >> 8),
SB_WIDTH, 4 + (sbstep >> 8));
}
// alternatives
if (m_alternatives > 0)
{
y =
OFFSET_POPUP + OFFSET_TEXT + m_h + m_yoffset - OFFSET_TEXT - m_fontHeight;
int dx = (m_w / (m_alternatives + 1));
int x = OFFSET_POPUP + OFFSET_TEXT;
System.out.println("Alternative>>dx=" + dx
+ ";x=" + x);
for (int i = 0; i < m_alternatives; i++)
{
char[] t = m_altTexts[i];
x += dx;
int nTWidth = m_font.charsWidth(t, 0, t.length) >> 1;
System.out.println("Alternative>>nTWidth=" + nTWidth
+ ";x=" + x);
int xx = x - nTWidth;
/*
* zhengyun 20051220 added
* 添加OK按钮上的背景色
*/
System.out.println("添加OK按钮上的背景色!");
g.setColor(m_borderColor);
g.drawRect(OFFSET_POPUP + 2, y, m_w - 5, m_fontHeight - 1);
g.setColor(m_textColor);
g.drawRect(OFFSET_POPUP + 3, y + 1, m_w - 6, m_fontHeight - 2);
// 绘制编辑框内的背景色,稍微浅色点
for (int yAlternative = y + 1; yAlternative < y + m_fontHeight - 1; yAlternative += 4)
{
int nTemp = y + m_fontHeight - yAlternative;
nTemp = 4>nTemp ? nTemp:4;
// public void drawRGB(int[] rgbData, int offset, int scanlength, int x, int y, int
// width, int height, boolean processAlpha).
g.drawRGB(m_rgbButtonData, 0, m_w - 6,
OFFSET_POPUP + 3, yAlternative, m_w - 6, nTemp, true);
}
if (m_curAlt != i)
{
System.out.println("Unselected alternative>>xx=" + xx
+ ";y=" + y);
// Unselected alternative
g.setColor(m_alternativeColor);
g.drawChars(t, 0, t.length, xx, y, Graphics.TOP | Graphics.LEFT);
}
else
{
System.out.println("Selected alternative>>xx=" + xx
+ ";y=" + y);
// Selected alternative
g.setColor(m_alternativeColor);
g.drawChars(t, 0, t.length, xx + 1, y + 1,
Graphics.TOP | Graphics.LEFT);
g.setColor(m_selectedAlternativeColor);
g.drawChars(t, 0, t.length, xx, y, Graphics.TOP | Graphics.LEFT);
}
}
}
}
}
catch(Exception exc)
{
m_display.setCurrent(
new Alert(
"错误",
"Popup.paint:"
+ exc.getMessage() + "/" + exc.getClass(),
null, AlertType.ERROR));
}
}
/**
* Handles user interaction when pressing a key.
* Call this from your <code>Displayable</code>'s
* keyPressed keyRepeated method.
*
* @param keyCode The keycode.
* @param gameCode The gamecode.
*/
public void keyPressed(int keyCode, int gameCode)
{
System.out.println("enter textfieldpopup::keypressed>>keyCode=" +
keyCode + ">>gameCode=" + gameCode);
if (m_active)
{
if (m_alternatives < 1)
{
// If no choice, any key will do
m_active = false;
if (m_listener != null)
{
m_listener.selectedChoice(m_curAlt, false);
return;
}
}
else
{
switch (gameCode)
{
// Scroll text
case Canvas.DOWN:
{
m_curLine++;
if (m_curLine >= m_maxLine)
m_curLine = 0;
break;
}
case Canvas.UP:
{
if (m_maxLine > 0)
m_curLine--;
if (m_curLine < 0)
m_curLine = m_maxLine - 1;
break;
}
// Select among choices
case Canvas.RIGHT:
{
m_curAlt++;
if (m_curAlt >= m_alternatives)
m_curAlt = 0;
break;
}
case Canvas.LEFT:
{
m_curAlt--;
if (m_curAlt < 0)
m_curAlt = (byte) (m_alternatives - 1);
break;
}
/*case Canvas.FIRE:
{
System.out.println("click fire>>m_clickEventID=" + m_clickEventID);
// Select
// 下面这句话是我注释的,因为FIRE之后却发现m_curAlt >= 0条件并不满足
//if (m_curAlt >= 0)
{
m_active = false;
if (m_listener != null)
m_listener.selectedChoice((byte)m_clickEventID, false);
}
break;
}*/
case Device.KEYCODE_BACK:
{
m_active = false;
if (m_listener != null)
m_listener.selectedChoice(m_timeOutAlt, false);
break;
}
}
/*
* 由于Nokia手机的5按键用gameCode的话,就对应到了Canvas.FIRE,这是我们不能接受的
* 必须使用keyCode来处理
* zhengyun added 20051227
*/
if(keyCode == PlatformCanvas.KEY_FIRE)
{
System.out.println("click fire>>m_clickEventID=" + m_clickEventID);
// Select
// 下面这句话是我注释的,因为FIRE之后却发现m_curAlt >= 0条件并不满足
//if (m_curAlt >= 0)
{
m_active = false;
if (m_listener != null)
{
m_listener.selectedChoice((byte)m_clickEventID, false);
// 剩下的处理就不用了
return;
}
}
}
}
//////////////////////////////////////////////////////
/*
* 处理按键 zhengyun 20051220
*/
boolean bRes = false;
resetCursor();
if (!insertMode && preProcessKeyCode(keyCode)) {
composer.caretRight();
}
final boolean curInsertMode = insertMode;
if (keyCode == PlatformCanvas.KEY_LEFT) {
bRes = composer.caretLeft();
}
if (keyCode == PlatformCanvas.KEY_RIGHT) {
bRes = composer.caretRight();
}
if (editable) {
if (keyCode == PlatformCanvas.KEY_STAR || keyCode == PlatformCanvas.KEY_CLEAR) {
bRes = composer.backspace();
}
if (keyCode == PlatformCanvas.KEY_POUND || (keyCode >= PlatformCanvas.KEY_NUM0 && keyCode <= PlatformCanvas.KEY_NUM9)) {
char ch = processKeyCode(keyCode);
System.out.println("processKeyCode return>>" + String.valueOf(ch));
if (ch == 0) return ;
bRes = composer.addChar(ch, curInsertMode);
if (insertMode) composer.caretRight();
}
}
initCursor();
lastKeyCode = keyCode;
///////////////////////////////////////////////////////////
}
}
protected void resetCursorHandler() {
insertMode = true;
charOptionCounter = 0;
}
/**
* Blinking rate for the curson in milliseconds
*/
protected static final int CURSOR_DELAY = 1000;
/**
* The timer is used to determine if key input time is elapsed
*/
protected Timer cHandler = null;
/**
* Cancels the timer
*/
synchronized protected void resetCursor()
{
if (cHandler != null)
{
cHandler.cancel();
cHandler = null;
}
}
/**
* Initializes new timer
*/
protected void initCursor()
{
if (!insertMode)
{
cHandler = new Timer();
cHandler.schedule(new CursorHandler(), CURSOR_DELAY);
}
}
/**
* The timer task, when elapsed cursor moves to next position
*/
class CursorHandler extends TimerTask
{
public CursorHandler()
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -