/**
* Created on Sep 21, 2008
*
* Copyright 2008 Vuze, Inc. All rights reserved.
* This program 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; version 2 of the License only.
*
* This program is distributed 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.aelitis.azureus.ui.swt.skin;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.*;
import org.gudy.azureus2.core3.util.AERunnable;
import org.gudy.azureus2.core3.util.Constants;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.ui.swt.Utils;
/**
* Native checkbox
*
* @author TuxPaper
* @created Dec 24, 2008
*
*/
public class SWTSkinObjectTextbox
extends SWTSkinObjectBasic
{
private Text textWidget;
private Composite cBubble;
private String text = "";
public SWTSkinObjectTextbox(SWTSkin skin, SWTSkinProperties properties,
String id, String configID, SWTSkinObject parentSkinObject) {
super(skin, properties, id, configID, "textbox", parentSkinObject);
Composite createOn;
if (parent == null) {
createOn = skin.getShell();
} else {
createOn = (Composite) parent.getControl();
}
int style = SWT.BORDER;
String styleString = properties.getStringValue(sConfigID + ".style");
if (styleString != null) {
String[] styles = Constants.PAT_SPLIT_COMMA.split(styleString.toLowerCase());
Arrays.sort(styles);
if (Arrays.binarySearch(styles, "readonly") >= 0) {
style |= SWT.READ_ONLY;
}
if (Arrays.binarySearch(styles, "wrap") >= 0) {
style |= SWT.WRAP;
}
if (Arrays.binarySearch(styles, "multiline") >= 0) {
style |= SWT.MULTI | SWT.V_SCROLL;
} else {
style |= SWT.SINGLE;
}
if (Arrays.binarySearch(styles, "search") >= 0) {
style |= SWT.SEARCH | SWT.ICON_SEARCH | SWT.ICON_CANCEL;
if (Constants.isWindows) {
cBubble = new Composite(createOn, SWT.NONE);
cBubble.setLayout(new FormLayout());
}
}
}
if ((style & SWT.WRAP) == 0 && (style & SWT.MULTI) > 0) {
style |= SWT.H_SCROLL;
}
if (cBubble == null) {
textWidget = new Text(createOn, style);
} else {
textWidget = new Text(cBubble, style & ~(SWT.BORDER | SWT.SEARCH));
FormData fd = new FormData();
fd.top = new FormAttachment(0, 2);
fd.bottom = new FormAttachment(100, -2);
fd.left = new FormAttachment(0, 17);
fd.right = new FormAttachment(100, -14);
textWidget.setLayoutData(fd);
cBubble.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
Rectangle clientArea = cBubble.getClientArea();
e.gc.setBackground(textWidget.getBackground());
e.gc.setAdvanced(true);
e.gc.setAntialias(SWT.ON);
e.gc.fillRoundRectangle(clientArea.x, clientArea.y,
clientArea.width - 1, clientArea.height - 1, clientArea.height,
clientArea.height);
e.gc.setAlpha(127);
e.gc.drawRoundRectangle(clientArea.x, clientArea.y,
clientArea.width - 1, clientArea.height - 1, clientArea.height,
clientArea.height);
e.gc.setLineCap(SWT.CAP_ROUND);
int iconHeight = clientArea.height - 9;
if (iconHeight > 13) {
iconHeight = 13;
}
int iconY = clientArea.y + ((clientArea.height - iconHeight + 1) / 2);
e.gc.setAlpha(120);
e.gc.setLineWidth(2);
e.gc.drawOval(clientArea.x + 6, iconY, 7, 6);
e.gc.drawPolyline(new int[] {
clientArea.x + 12,
iconY + 6,
clientArea.x + 15,
iconY + iconHeight,
});
boolean textIsBlank = text.length() == 0;
if (!textIsBlank) {
//e.gc.setLineWidth(1);
e.gc.setAlpha(80);
Rectangle rXArea = new Rectangle(clientArea.x + clientArea.width
- 16, clientArea.y + 1, 11, clientArea.height - 2);
cBubble.setData("XArea", rXArea);
e.gc.drawPolyline(new int[] {
clientArea.x + clientArea.width - 7,
clientArea.y + 7,
clientArea.x + clientArea.width - (7 + 5),
clientArea.y + clientArea.height - 7,
});
e.gc.drawPolyline(new int[] {
clientArea.x + clientArea.width - 7,
clientArea.y + clientArea.height - 7,
clientArea.x + clientArea.width - (7 + 5),
clientArea.y + 7,
});
}
}
});
cBubble.addListener(SWT.MouseDown, new Listener() {
public void handleEvent(Event event) {
Rectangle r = (Rectangle) event.widget.getData("XArea");
if (r != null && r.contains(event.x, event.y)) {
textWidget.setText("");
}
}
});
}
textWidget.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
boolean textWasBlank = text.length() == 0;
text = textWidget.getText();
boolean textIsBlank = text.length() == 0;
if (textWasBlank != textIsBlank && cBubble != null) {
cBubble.redraw();
}
}
});
String message = properties.getStringValue(configID + ".message", (String) null);
if (message != null && message.length() > 0) {
textWidget.setMessage(message);
}
setControl(cBubble == null ? textWidget : cBubble);
}
// @see com.aelitis.azureus.ui.swt.skin.SWTSkinObjectBasic#switchSuffix(java.lang.String, int, boolean)
public String switchSuffix(String suffix, int level, boolean walkUp,
boolean walkDown) {
suffix = super.switchSuffix(suffix, level, walkUp, walkDown);
if (suffix == null) {
return null;
}
String sPrefix = sConfigID + ".text";
String text = properties.getStringValue(sPrefix + suffix);
if (text != null) {
setText(text);
}
return suffix;
}
public void setText(final String val) {
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
if (textWidget != null && !textWidget.isDisposed()) {
textWidget.setText(val == null ? "" : val);
text = val;
}
}
});
}
public String getText() {
return text;
}
public Text getTextControl() {
return textWidget;
}
}