/* This file belongs to the Servoy development and deployment environment, Copyright (C) 1997-2010 Servoy BV This program is free software; you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program; if not, see http://www.gnu.org/licenses or write to the Free Software Foundation,Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 */ package com.servoy.j2db.ui.scripting; import java.awt.Dimension; import java.awt.Rectangle; import javax.swing.JViewport; import javax.swing.text.JTextComponent; import com.servoy.j2db.IApplication; import com.servoy.j2db.ui.IFieldComponent; import com.servoy.j2db.ui.IStylePropertyChangesRecorder; import com.servoy.j2db.ui.ISupportEditProvider; import com.servoy.j2db.ui.ISupportInputSelection; import com.servoy.j2db.ui.ISupportScroll; import com.servoy.j2db.ui.runtime.HasRuntimeScroll; import com.servoy.j2db.ui.runtime.HasRuntimeTextInput; import com.servoy.j2db.ui.runtime.IRuntimeInputComponent; /** * Abstract scriptable text component. * * @author lvostinar * @since 6.0 */ public abstract class AbstractRuntimeTextComponent<C extends IFieldComponent, T extends JTextComponent> extends AbstractRuntimeField<C> implements IRuntimeInputComponent, HasRuntimeTextInput, HasRuntimeScroll { protected T textComponent; public AbstractRuntimeTextComponent(IStylePropertyChangesRecorder jsChangeRecorder, IApplication application) { super(jsChangeRecorder, application); } /** * @param textComponent the textComponent to set */ public void setTextComponent(T textComponent) { this.textComponent = textComponent; } public int getCaretPosition() { if (textComponent != null) { return textComponent.getCaretPosition(); } return 0; } public void setCaretPosition(int pos) { if (textComponent != null) { if (pos < 0) textComponent.setCaretPosition(0); else if (pos > textComponent.getDocument().getLength()) textComponent.setCaretPosition(textComponent.getDocument().getLength()); else textComponent.setCaretPosition(pos); } } public void setScroll(int x, int y) { if (textComponent != null) { Rectangle rect = new Rectangle(x, y, getComponent().getSize().width, getComponent().getSize().height); if (textComponent.getParent() instanceof JViewport) { // you cannot ask for a region bigger then the actual view extent size to be visible - that would have no effect in some cases; // but if you want x and y to be the coordinates where the visible area starts (if that is possible) then a rectangle the same size as the visible area must be used Dimension s = ((JViewport)textComponent.getParent()).getExtentSize(); rect.width = s.width; rect.height = s.height; } textComponent.scrollRectToVisible(rect); } else { Object c = getComponent(); if (c instanceof ISupportScroll) { ((ISupportScroll)c).setScroll(x, y); getChangesRecorder().setChanged(); } } } public int getScrollX() { if (textComponent != null) { return textComponent.getVisibleRect().x; } else { Object c = getComponent(); if (c instanceof ISupportScroll) { return ((ISupportScroll)c).getScroll().x; } } return 0; } public int getScrollY() { if (textComponent != null) { return textComponent.getVisibleRect().y; } else { Object c = getComponent(); if (c instanceof ISupportScroll) { return ((ISupportScroll)c).getScroll().y; } } return 0; } @Deprecated public boolean isEditable() { return getComponent().isEditable(); } @Deprecated public void setEditable(boolean b) { if (isEditable() != b) { getComponent().setEditable(b); getChangesRecorder().setChanged(); } } public void selectAll() { if (textComponent != null) { textComponent.selectAll(); } if (getComponent() instanceof ISupportInputSelection) { ((ISupportInputSelection)getComponent()).selectAll(); } } public String getSelectedText() { if (textComponent != null) { return textComponent.getSelectedText(); } if (getComponent() instanceof ISupportInputSelection) { return ((ISupportInputSelection)getComponent()).getSelectedText(); } return null; } public void replaceSelectedText(String s) { if (textComponent != null) { if (getComponent() instanceof ISupportEditProvider && ((ISupportEditProvider)getComponent()).getEditProvider() != null) ((ISupportEditProvider)getComponent()).getEditProvider().startEdit(); textComponent.replaceSelection(s); if (getComponent() instanceof ISupportEditProvider && ((ISupportEditProvider)getComponent()).getEditProvider() != null) ((ISupportEditProvider)getComponent()).getEditProvider().commitData(); } if (getComponent() instanceof ISupportInputSelection) { ((ISupportInputSelection)getComponent()).replaceSelectedText(s); } } @Override public String getToolTipText() { if (textComponent != null) { return textComponent.getToolTipText(); } return super.getToolTipText(); } }