提交 f7715bec 编写于 作者: L lana

Merge

...@@ -42,7 +42,7 @@ endif ...@@ -42,7 +42,7 @@ endif
SUBDIRS = java security net/ssl jarsigner SUBDIRS = java security net/ssl jarsigner
SUBDIRS_management = jmx SUBDIRS_management = jmx
SUBDIRS_desktop = image inputmethods SUBDIRS_desktop = image
SUBDIRS_enterprise = crypto/provider jndi \ SUBDIRS_enterprise = crypto/provider jndi \
org xml rowset net/httpserver org xml rowset net/httpserver
SUBDIRS_misc = $(SCRIPT_SUBDIR) tracing servicetag nio demo SUBDIRS_misc = $(SCRIPT_SUBDIR) tracing servicetag nio demo
......
#
# Copyright (c) 2002, 2005, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code 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
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
#
# Makefile for building Java input methods
#
BUILDDIR = ../../..
PRODUCT = sun
include $(BUILDDIR)/common/Defs.gmk
SUBDIRS = indicim thaiim
include $(BUILDDIR)/common/Subdirs.gmk
all build clean clobber::
$(SUBDIRS-loop)
#
# Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code 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
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
#
# Makefile for indic input method.
#
BUILDDIR = ../../../..
PACKAGE = com.sun.inputmethods.internal.indicim
PRODUCT = sun
CLASSDESTDIR = $(TEMPDIR)/classes
SERVICESDIR=META-INF/services
IMJAR = $(IMJARDIR)/indicim.jar
IMJARDIR=$(LIBDIR)/im
include $(BUILDDIR)/common/Defs.gmk
#
# Files
#
AUTO_FILES_JAVA_DIRS = com/sun/inputmethods/internal/indicim
FILES_copy = \
$(CLASSDESTDIR)/com/sun/inputmethods/internal/indicim/resources/DisplayNames.properties
PROVIDER_CONF_FILE = \
$(CLASSDESTDIR)/$(SERVICESDIR)/java.awt.im.spi.InputMethodDescriptor
#
# Rules
#
include $(BUILDDIR)/common/Classes.gmk
build: $(IMJAR)
#
# Extra rules to build im.
#
$(CLASSDESTDIR)/com/sun/inputmethods/internal/indicim/resources/% : $(SHARE_SRC)/classes/com/sun/inputmethods/internal/indicim/resources/%
$(install-file)
$(CLASSDESTDIR)/$(SERVICESDIR)/java.awt.im.spi.InputMethodDescriptor : $(SHARE_SRC)/classes/com/sun/inputmethods/internal/indicim/java.awt.im.spi.InputMethodDescriptor
$(install-file)
$(IMJAR): $(FILES_class) $(FILES_copy) $(PROVIDER_CONF_FILE)
$(prep-target)
$(BOOT_JAR_CMD) -cf $@ \
-C $(CLASSDESTDIR) com \
-C $(CLASSDESTDIR) $(SERVICESDIR) \
$(BOOT_JAR_JFLAGS)
@$(java-vm-cleanup)
clean::
$(RM) -r $(CLASSDESTDIR)
$(RM) $(IMJAR)
#
# Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code 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
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
#
# Makefile for thai input method.
#
BUILDDIR = ../../../..
PACKAGE = com.sun.inputmethods.internal.thaiim
PRODUCT = sun
CLASSDESTDIR = $(TEMPDIR)/classes
SERVICESDIR=META-INF/services
IMJAR = $(IMJARDIR)/thaiim.jar
IMJARDIR=$(LIBDIR)/im
include $(BUILDDIR)/common/Defs.gmk
#
# Files
#
AUTO_FILES_JAVA_DIRS = com/sun/inputmethods/internal/thaiim
FILES_copy = \
$(CLASSDESTDIR)/com/sun/inputmethods/internal/thaiim/resources/DisplayNames.properties
PROVIDER_CONF_FILE = \
$(CLASSDESTDIR)/$(SERVICESDIR)/java.awt.im.spi.InputMethodDescriptor
#
# Rules
#
include $(BUILDDIR)/common/Classes.gmk
build: $(IMJAR)
#
# Extra rules to build im.
#
$(CLASSDESTDIR)/com/sun/inputmethods/internal/thaiim/resources/% : $(SHARE_SRC)/classes/com/sun/inputmethods/internal/thaiim/resources/%
$(install-file)
$(CLASSDESTDIR)/$(SERVICESDIR)/java.awt.im.spi.InputMethodDescriptor : $(SHARE_SRC)/classes/com/sun/inputmethods/internal/thaiim/java.awt.im.spi.InputMethodDescriptor
$(install-file)
$(IMJAR): $(FILES_class) $(FILES_copy) $(PROVIDER_CONF_FILE)
$(prep-target)
$(BOOT_JAR_CMD) -cf $@ \
-C $(CLASSDESTDIR) com \
-C $(CLASSDESTDIR) $(SERVICESDIR) \
$(BOOT_JAR_JFLAGS)
@$(java-vm-cleanup)
clean::
$(RM) -r $(CLASSDESTDIR)
$(RM) $(IMJAR)
...@@ -47,8 +47,7 @@ IMAGE_BINDIR = bin ...@@ -47,8 +47,7 @@ IMAGE_BINDIR = bin
# Swing has taken this approach only as a temporary measure to avoid # Swing has taken this approach only as a temporary measure to avoid
# the compiler warnings until we can properly document these packages. # the compiler warnings until we can properly document these packages.
# This is covered under 6491853. # This is covered under 6491853.
EXCLUDE_PROPWARN_PKGS = com.sun.java.swing.plaf \ EXCLUDE_PROPWARN_PKGS = com.sun.java.swing.plaf.windows \
com.sun.java.swing.plaf.windows \
com.sun.java.swing.plaf.motif \ com.sun.java.swing.plaf.motif \
com.sun.java.swing.plaf.gtk com.sun.java.swing.plaf.gtk
......
...@@ -25,7 +25,6 @@ ...@@ -25,7 +25,6 @@
MISC_FILES = \ MISC_FILES = \
$(CLASSBINDIR)/javax/swing/text/html/default.css \ $(CLASSBINDIR)/javax/swing/text/html/default.css \
$(CLASSBINDIR)/javax/swing/text/html/parser/html32.bdtd \
$(CLASSBINDIR)/javax/swing/text/rtf/charsets/NeXT.txt \ $(CLASSBINDIR)/javax/swing/text/rtf/charsets/NeXT.txt \
$(CLASSBINDIR)/javax/swing/text/rtf/charsets/ansi.txt \ $(CLASSBINDIR)/javax/swing/text/rtf/charsets/ansi.txt \
$(CLASSBINDIR)/javax/swing/text/rtf/charsets/cpg437.txt \ $(CLASSBINDIR)/javax/swing/text/rtf/charsets/cpg437.txt \
......
...@@ -59,9 +59,6 @@ $(CLASSBINDIR)/%.gif: $(SHARE_SRC)/classes/%.gif ...@@ -59,9 +59,6 @@ $(CLASSBINDIR)/%.gif: $(SHARE_SRC)/classes/%.gif
$(CLASSBINDIR)/%.css: $(SHARE_SRC)/classes/%.css $(CLASSBINDIR)/%.css: $(SHARE_SRC)/classes/%.css
$(install-file) $(install-file)
$(CLASSBINDIR)/%.bdtd: $(SHARE_SRC)/classes/%.bdtd
$(install-file)
$(CLASSBINDIR)/%.txt: $(SHARE_SRC)/classes/%.txt $(CLASSBINDIR)/%.txt: $(SHARE_SRC)/classes/%.txt
$(install-file) $(install-file)
...@@ -2259,7 +2259,6 @@ com/sun/java/swing/plaf/gtk/GTKLookAndFeel$1FontLazyValue ...@@ -2259,7 +2259,6 @@ com/sun/java/swing/plaf/gtk/GTKLookAndFeel$1FontLazyValue
com/sun/java/swing/plaf/gtk/GTKLookAndFeel$2 com/sun/java/swing/plaf/gtk/GTKLookAndFeel$2
com/sun/java/swing/plaf/gtk/GTKLookAndFeel$3 com/sun/java/swing/plaf/gtk/GTKLookAndFeel$3
javax/swing/plaf/synth/SynthPanelUI javax/swing/plaf/synth/SynthPanelUI
sun/swing/plaf/synth/SynthUI
javax/swing/plaf/synth/SynthConstants javax/swing/plaf/synth/SynthConstants
javax/swing/plaf/synth/SynthContext javax/swing/plaf/synth/SynthContext
javax/swing/plaf/synth/SynthBorder javax/swing/plaf/synth/SynthBorder
...@@ -2271,6 +2270,7 @@ javax/swing/plaf/basic/BasicBorders$FieldBorder ...@@ -2271,6 +2270,7 @@ javax/swing/plaf/basic/BasicBorders$FieldBorder
javax/swing/plaf/synth/SynthMenuBarUI javax/swing/plaf/synth/SynthMenuBarUI
javax/swing/plaf/synth/DefaultMenuLayout javax/swing/plaf/synth/DefaultMenuLayout
javax/swing/plaf/synth/SynthMenuUI javax/swing/plaf/synth/SynthMenuUI
javax/swing/plaf/synth/SynthUI
com/sun/java/swing/plaf/gtk/GTKIconFactory com/sun/java/swing/plaf/gtk/GTKIconFactory
com/sun/java/swing/plaf/gtk/GTKIconFactory$MenuArrowIcon com/sun/java/swing/plaf/gtk/GTKIconFactory$MenuArrowIcon
com/sun/java/swing/plaf/gtk/GTKIconFactory$DelegatingIcon com/sun/java/swing/plaf/gtk/GTKIconFactory$DelegatingIcon
......
...@@ -2360,7 +2360,6 @@ com/sun/java/swing/plaf/gtk/GTKLookAndFeel$1FontLazyValue ...@@ -2360,7 +2360,6 @@ com/sun/java/swing/plaf/gtk/GTKLookAndFeel$1FontLazyValue
com/sun/java/swing/plaf/gtk/GTKLookAndFeel$2 com/sun/java/swing/plaf/gtk/GTKLookAndFeel$2
com/sun/java/swing/plaf/gtk/GTKLookAndFeel$3 com/sun/java/swing/plaf/gtk/GTKLookAndFeel$3
javax/swing/plaf/synth/SynthPanelUI javax/swing/plaf/synth/SynthPanelUI
sun/swing/plaf/synth/SynthUI
javax/swing/plaf/synth/SynthConstants javax/swing/plaf/synth/SynthConstants
javax/swing/plaf/synth/SynthContext javax/swing/plaf/synth/SynthContext
javax/swing/plaf/synth/SynthBorder javax/swing/plaf/synth/SynthBorder
...@@ -2373,6 +2372,7 @@ javax/swing/plaf/basic/BasicBorders$FieldBorder ...@@ -2373,6 +2372,7 @@ javax/swing/plaf/basic/BasicBorders$FieldBorder
javax/swing/plaf/synth/SynthMenuBarUI javax/swing/plaf/synth/SynthMenuBarUI
javax/swing/plaf/synth/DefaultMenuLayout javax/swing/plaf/synth/DefaultMenuLayout
javax/swing/plaf/synth/SynthMenuUI javax/swing/plaf/synth/SynthMenuUI
javax/swing/plaf/synth/SynthUI
com/sun/java/swing/plaf/gtk/GTKIconFactory com/sun/java/swing/plaf/gtk/GTKIconFactory
com/sun/java/swing/plaf/gtk/GTKIconFactory$MenuArrowIcon com/sun/java/swing/plaf/gtk/GTKIconFactory$MenuArrowIcon
com/sun/java/swing/plaf/gtk/GTKIconFactory$DelegatingIcon com/sun/java/swing/plaf/gtk/GTKIconFactory$DelegatingIcon
......
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* (C) Copyright IBM Corp. 2000 - All Rights Reserved
*
* The original version of this source code and documentation is
* copyrighted and owned by IBM. These materials are provided
* under terms of a License Agreement between IBM and Sun.
* This technology is protected by multiple US and International
* patents. This notice and attribution to IBM may not be removed.
*
*/
package com.sun.inputmethods.internal.indicim;
import java.awt.Image;
import java.awt.im.spi.InputMethod;
import java.awt.im.spi.InputMethodDescriptor;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
public class DevanagariInputMethodDescriptor implements InputMethodDescriptor {
static final Locale HINDI = new Locale("hi", "IN");
public DevanagariInputMethodDescriptor() {
}
/**
* @see java.awt.im.spi.InputMethodDescriptor#getAvailableLocales
*/
public Locale[] getAvailableLocales() {
return new Locale[] { HINDI };
}
/**
* @see java.awt.im.spi.InputMethodDescriptor#hasDynamicLocaleList
*/
public boolean hasDynamicLocaleList() {
return false;
}
/**
* @see java.awt.im.spi.InputMethodDescriptor#getInputMethodDisplayName
*/
public synchronized String getInputMethodDisplayName(Locale inputLocale, Locale displayLanguage) {
try {
ResourceBundle resources = ResourceBundle.getBundle("com.sun.inputmethods.internal.indicim.resources.DisplayNames", displayLanguage);
return resources.getString("DisplayName.Devanagari");
} catch (MissingResourceException mre) {
return "Devanagari Input Method";
}
}
/**
* @see java.awt.im.spi.InputMethodDescriptor#getInputMethodIcon
*/
public Image getInputMethodIcon(Locale inputLocale) {
return null;
}
/**
* @see java.awt.im.spi.InputMethodDescriptor#createInputMethod
*/
public InputMethod createInputMethod() throws Exception {
IndicInputMethodImpl impl = new IndicInputMethodImpl(
DevanagariTables.keyboardMap,
DevanagariTables.joinWithNukta,
DevanagariTables.nuktaForm,
DevanagariTables.substitutionTable);
return new IndicInputMethod(HINDI, impl);
}
public String toString() {
return getClass().getName();
}
}
/*
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* (C) Copyright IBM Corp. 2000 - All Rights Reserved
*
* The original version of this source code and documentation is
* copyrighted and owned by IBM. These materials are provided
* under terms of a License Agreement between IBM and Sun.
* This technology is protected by multiple US and International
* patents. This notice and attribution to IBM may not be removed.
*
*/
package com.sun.inputmethods.internal.indicim;
class DevanagariTables {
static final char[] keyboardMap = {
/* 00 */ '\u0000',
/* 01 */ '\u0001',
/* 02 */ '\u0002',
/* 03 */ '\u0003',
/* 04 */ '\u0004',
/* 05 */ '\u0005',
/* 06 */ '\u0006',
/* 07 */ '\u0007',
/* 08 */ '\u0008',
/* 09 */ '\u0009',
/* 0A */ '\012',
/* 0B */ '\u000B',
/* 0C */ '\u000C',
/* 0D */ '\015',
/* 0E */ '\u000E',
/* 0F */ '\u000F',
/* 10 */ '\u0010',
/* 11 */ '\u0011',
/* 12 */ '\u0012',
/* 13 */ '\u0013',
/* 14 */ '\u0014',
/* 15 */ '\u0015',
/* 16 */ '\u0016',
/* 17 */ '\u0017',
/* 18 */ '\u0018',
/* 19 */ '\u0019',
/* 1A */ '\u001A',
/* 1B */ '\u001B',
/* 1C */ '\u001C',
/* 1D */ '\u001D',
/* 1E */ '\u001E',
/* 1F */ '\u001F',
/* 20 */ '\u0020',
/* 21 */ '\u090D', // '!'
/* 22 */ '\u0920', // '"'
/* 23 */ '\uFF00', // '#'
/* 24 */ '\uFF01', // '$'
/* 25 */ '\uFF02', // '%'
/* 26 */ '\uFF04', // '&'
/* 27 */ '\u091F', // '''
/* 28 */ '\u0028', // '('
/* 29 */ '\u0029', // ')'
/* 2A */ '\uFF05', // '*'
/* 2B */ '\u090B', // '+'
/* 2C */ '\u002C', // ','
/* 2D */ '\u002D', // '-'
/* 2E */ '\u002E', // '.'
/* 2F */ '\u092F', // '/'
/* 30 */ '\u0966', // '0'
/* 31 */ '\u0967', // '1'
/* 32 */ '\u0968', // '2'
/* 33 */ '\u0969', // '3'
/* 34 */ '\u096A', // '4'
/* 35 */ '\u096B', // '5'
/* 36 */ '\u096C', // '6'
/* 37 */ '\u096D', // '7'
/* 38 */ '\u096E', // '8'
/* 39 */ '\u096F', // '9'
/* 3A */ '\u091B', // ':'
/* 3B */ '\u091A', // ';'
/* 3C */ '\u0937', // '<'
/* 3D */ '\u0943', // '='
/* 3E */ '\u0964', // '>'
/* 3F */ '\u095F', // '?'
/* 40 */ '\u0945', // '@'
/* 41 */ '\u0913', // 'A'
/* 42 */ '\u0934', // 'B'
/* 43 */ '\u0923', // 'C'
/* 44 */ '\u0905', // 'D'
/* 45 */ '\u0906', // 'E'
/* 46 */ '\u0907', // 'F'
/* 47 */ '\u0909', // 'G'
/* 48 */ '\u092B', // 'H'
/* 49 */ '\u0918', // 'I'
/* 4A */ '\u0931', // 'J'
/* 4B */ '\u0916', // 'K'
/* 4C */ '\u0925', // 'L'
/* 4D */ '\u0936', // 'M'
/* 4E */ '\u0933', // 'N'
/* 4F */ '\u0927', // 'O'
/* 50 */ '\u091D', // 'P'
/* 51 */ '\u0914', // 'Q'
/* 52 */ '\u0908', // 'R'
/* 53 */ '\u090F', // 'S'
/* 54 */ '\u090A', // 'T'
/* 55 */ '\u0919', // 'U'
/* 56 */ '\u0929', // 'V'
/* 57 */ '\u0910', // 'W'
/* 58 */ '\u0901', // 'X'
/* 59 */ '\u092D', // 'Y'
/* 5A */ '\u090E', // 'Z'
/* 5B */ '\u0921', // '['
/* 5C */ '\u0949', // '\'
/* 5D */ '\u093C', // ']'
/* 5E */ '\uFF03', // '^'
/* 5F */ '\u0903', // '_'
/* 60 */ '\u094A', // '`'
/* 61 */ '\u094B', // 'a'
/* 62 */ '\u0935', // 'b'
/* 63 */ '\u092E', // 'c'
/* 64 */ '\u094D', // 'd'
/* 65 */ '\u093E', // 'e'
/* 66 */ '\u093F', // 'f'
/* 67 */ '\u0941', // 'g'
/* 68 */ '\u092A', // 'h'
/* 69 */ '\u0917', // 'i'
/* 6A */ '\u0930', // 'j'
/* 6B */ '\u0915', // 'k'
/* 6C */ '\u0924', // 'l'
/* 6D */ '\u0938', // 'm'
/* 6E */ '\u0932', // 'n'
/* 6F */ '\u0926', // 'o'
/* 70 */ '\u091C', // 'p'
/* 71 */ '\u094C', // 'q'
/* 72 */ '\u0940', // 'r'
/* 73 */ '\u0947', // 's'
/* 74 */ '\u0942', // 't'
/* 75 */ '\u0939', // 'u'
/* 76 */ '\u0928', // 'v'
/* 77 */ '\u0948', // 'w'
/* 78 */ '\u0902', // 'x'
/* 79 */ '\u092C', // 'y'
/* 7A */ '\u0946', // 'z'
/* 7B */ '\u0922', // '{'
/* 7C */ '\u0911', // '|'
/* 7D */ '\u091E', // '}'
/* 7E */ '\u0912', // '~'
/* 7F */ '\u007F' //
};
// the character substitutions for the meta characters.
static final char[] RA_SUB = {'\u094D', '\u0930'};
static final char[] RA_SUP = {'\u0930', '\u094D'};
static final char[] CONJ_JA_NYA = {'\u091C', '\u094D', '\u091E'};
static final char[] CONJ_TA_RA = {'\u0924', '\u094D', '\u0930'};
static final char[] CONJ_KA_SSA = {'\u0915', '\u094D', '\u0937'};
static final char[] CONJ_SHA_RA = {'\u0936', '\u094D', '\u0930'};
static final char[][] substitutionTable = {
RA_SUB, RA_SUP, CONJ_JA_NYA, CONJ_TA_RA, CONJ_KA_SSA, CONJ_SHA_RA
};
// The following characters followed by Nukta should be replaced
// by the corresponding character as defined in ISCII91
static final char SIGN_CANDRABINDU = '\u0901';
static final char LETTER_I = '\u0907';
static final char LETTER_II = '\u0908';
static final char LETTER_VOCALIC_R = '\u090B';
static final char LETTER_KA = '\u0915';
static final char LETTER_KHA = '\u0916';
static final char LETTER_GA = '\u0917';
static final char LETTER_JA = '\u091C';
static final char LETTER_DDA = '\u0921';
static final char LETTER_DDHA = '\u0922';
static final char LETTER_PHA = '\u092B';
static final char VOWEL_SIGN_I = '\u093F';
static final char VOWEL_SIGN_II = '\u0940';
static final char VOWEL_SIGN_VOCALIC_R = '\u0943';
static final char DANDA = '\u0964';
// The follwing characters replace the above characters followed by Nukta. These
// are defined in one to one correspondence order.
static final char SIGN_OM = '\u0950';
static final char LETTER_VOCALIC_L = '\u090C';
static final char LETTER_VOCALIC_LL = '\u0961';
static final char LETTER_VOCALIC_RR = '\u0960';
static final char LETTER_QA = '\u0958';
static final char LETTER_KHHA = '\u0959';
static final char LETTER_GHHA = '\u095A';
static final char LETTER_ZA = '\u095B';
static final char LETTER_DDDHA = '\u095C';
static final char LETTER_RHA = '\u095D';
static final char LETTER_FA = '\u095E';
static final char VOWEL_SIGN_VOCALIC_L = '\u0962';
static final char VOWEL_SIGN_VOCALIC_LL = '\u0963';
static final char VOWEL_SIGN_VOCALIC_RR = '\u0944';
static final char SIGN_AVAGRAHA = '\u093D';
static final char[] joinWithNukta = {
SIGN_CANDRABINDU,
LETTER_I,
LETTER_II,
LETTER_VOCALIC_R ,
LETTER_KA,
LETTER_KHA,
LETTER_GA,
LETTER_JA,
LETTER_DDA,
LETTER_DDHA,
LETTER_PHA,
VOWEL_SIGN_I,
VOWEL_SIGN_II,
VOWEL_SIGN_VOCALIC_R,
DANDA
};
static final char[] nuktaForm = {
SIGN_OM,
LETTER_VOCALIC_L,
LETTER_VOCALIC_LL,
LETTER_VOCALIC_RR,
LETTER_QA,
LETTER_KHHA,
LETTER_GHHA,
LETTER_ZA,
LETTER_DDDHA,
LETTER_RHA,
LETTER_FA,
VOWEL_SIGN_VOCALIC_L,
VOWEL_SIGN_VOCALIC_LL,
VOWEL_SIGN_VOCALIC_RR,
SIGN_AVAGRAHA
};
}
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* (C) Copyright IBM Corp. 2000 - All Rights Reserved
*
* The original version of this source code and documentation is
* copyrighted and owned by IBM. These materials are provided
* under terms of a License Agreement between IBM and Sun.
* This technology is protected by multiple US and International
* patents. This notice and attribution to IBM may not be removed.
*
*/
package com.sun.inputmethods.internal.indicim;
import java.awt.im.spi.InputMethod;
import java.awt.im.spi.InputMethodContext;
import java.awt.AWTEvent;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.lang.Character.Subset;
import java.util.Locale;
class IndicInputMethod implements InputMethod {
private IndicInputMethodImpl impl;
private Locale locale;
IndicInputMethod(Locale theLocale, IndicInputMethodImpl theImplementation) {
locale = theLocale;
impl = theImplementation;
}
/**
* Sets the input method context, which is used to dispatch input method
* events to the client component and to request information from
* the client component.
* <p>
* This method is called once immediately after instantiating this input
* method.
*
* @param context the input method context for this input method
* @exception NullPointerException if <code>context</code> is null
*/
public void setInputMethodContext(InputMethodContext context) {
impl.setInputMethodContext(context);
}
/**
* Attempts to set the input locale. If the input method supports the
* desired locale, it changes its behavior to support input for the locale
* and returns true.
* Otherwise, it returns false and does not change its behavior.
* <p>
* This method is called
* <ul>
* <li>by {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod},
* <li>when switching to this input method through the user interface if the user
* specified a locale or if the previously selected input method's
* {@link java.awt.im.spi.InputMethod#getLocale getLocale} method
* returns a non-null value.
* </ul>
*
* @param locale locale to input
* @return whether the specified locale is supported
* @exception NullPointerException if <code>locale</code> is null
*/
public boolean setLocale(Locale locale) {
if (locale.getLanguage().equals(this.locale.getLanguage())) {
//System.out.println("returning true for locale " + locale);
return true;
}
else {
//System.out.println("returning false for locale " + locale);
return false;
}
}
/**
* Returns the current input locale. Might return null in exceptional cases.
* <p>
* This method is called
* <ul>
* <li>by {@link java.awt.im.InputContext#getLocale InputContext.getLocale} and
* <li>when switching from this input method to a different one through the
* user interface.
* </ul>
*
* @return the current input locale, or null
*/
public Locale getLocale() {
return locale;
}
/**
* Sets the subsets of the Unicode character set that this input method
* is allowed to input. Null may be passed in to indicate that all
* characters are allowed.
* <p>
* This method is called
* <ul>
* <li>immediately after instantiating this input method,
* <li>when switching to this input method from a different one, and
* <li>by {@link java.awt.im.InputContext#setCharacterSubsets InputContext.setCharacterSubsets}.
* </ul>
*
* @param subsets the subsets of the Unicode character set from which
* characters may be input
*/
public void setCharacterSubsets(Subset[] subsets) {
}
/**
* Enables or disables this input method for composition,
* depending on the value of the parameter <code>enable</code>.
* <p>
* An input method that is enabled for composition interprets incoming
* events for both composition and control purposes, while a
* disabled input method does not interpret events for composition.
* Note however that events are passed on to the input method regardless
* whether it is enabled or not, and that an input method that is disabled
* for composition may still interpret events for control purposes,
* including to enable or disable itself for composition.
* <p>
* This method is called
* <ul>
* <li>by {@link java.awt.im.InputContext#setCompositionEnabled InputContext.setCompositionEnabled},
* <li>when switching to this input method from a different one using the
* user interface or
* {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod},
* if the previously selected input method's
* {@link java.awt.im.spi.InputMethod#isCompositionEnabled isCompositionEnabled}
* method returns without throwing an exception.
* </ul>
*
* @param enable whether to enable the input method for composition
* @throws UnsupportedOperationException if this input method does not
* support the enabling/disabling operation
* @see #isCompositionEnabled
*/
public void setCompositionEnabled(boolean enable) {
throw new UnsupportedOperationException();
}
/**
* Determines whether this input method is enabled.
* An input method that is enabled for composition interprets incoming
* events for both composition and control purposes, while a
* disabled input method does not interpret events for composition.
* <p>
* This method is called
* <ul>
* <li>by {@link java.awt.im.InputContext#isCompositionEnabled InputContext.isCompositionEnabled} and
* <li>when switching from this input method to a different one using the
* user interface or
* {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod}.
* </ul>
*
* @return <code>true</code> if this input method is enabled for
* composition; <code>false</code> otherwise.
* @throws UnsupportedOperationException if this input method does not
* support checking whether it is enabled for composition
* @see #setCompositionEnabled
*/
public boolean isCompositionEnabled() {
return true;
}
/**
* Starts the reconversion operation. The input method obtains the
* text to be reconverted from the current client component using the
* {@link java.awt.im.InputMethodRequests#getSelectedText InputMethodRequests.getSelectedText}
* method. It can use other <code>InputMethodRequests</code>
* methods to request additional information required for the
* reconversion operation. The composed and committed text
* produced by the operation is sent to the client component as a
* sequence of <code>InputMethodEvent</code>s. If the given text
* cannot be reconverted, the same text should be sent to the
* client component as committed text.
* <p>
* This method is called by
* {@link java.awt.im.InputContext#reconvert() InputContext.reconvert}.
*
* @throws UnsupportedOperationException if the input method does not
* support the reconversion operation.
*/
public void reconvert() {
throw new UnsupportedOperationException("This input method does not reconvert.");
}
/**
* Dispatches the event to the input method. If input method support is
* enabled for the focussed component, incoming events of certain types
* are dispatched to the current input method for this component before
* they are dispatched to the component's methods or event listeners.
* The input method decides whether it needs to handle the event. If it
* does, it also calls the event's <code>consume</code> method; this
* causes the event to not get dispatched to the component's event
* processing methods or event listeners.
* <p>
* Events are dispatched if they are instances of InputEvent or its
* subclasses.
* This includes instances of the AWT classes KeyEvent and MouseEvent.
* <p>
* This method is called by {@link java.awt.im.InputContext#dispatchEvent InputContext.dispatchEvent}.
*
* @param event the event being dispatched to the input method
* @exception NullPointerException if <code>event</code> is null
*/
public void dispatchEvent(AWTEvent event) {
if (event instanceof KeyEvent) {
KeyEvent keyEvent = (KeyEvent) event;
if (event.getID() == KeyEvent.KEY_TYPED) {
impl.handleKeyTyped(keyEvent);
}
//System.out.println("handled event " + event);
}
else {
//System.out.println("did not handle event " + event);
}
}
/**
* Notifies this input method of changes in the client window
* location or state. This method is called while this input
* method is the current input method of its input context and
* notifications for it are enabled (see {@link
* InputMethodContext#enableClientWindowNotification
* InputMethodContext.enableClientWindowNotification}). Calls
* to this method are temporarily suspended if the input context's
* {@link java.awt.im.InputContext#removeNotify removeNotify}
* method is called, and resume when the input method is activated
* for a new client component. It is called in the following
* situations:
* <ul>
* <li>
* when the window containing the current client component changes
* in location, size, visibility, iconification state, or when the
* window is closed.</li>
* <li>
* from <code> enableClientWindowNotification(inputMethod,
* true)</code> if the current client component exists,</li>
* <li>
* when activating the input method for the first time after it
* called
* <code>enableClientWindowNotification(inputMethod,
* true)</code> if during the call no current client component was
* available,</li>
* <li>
* when activating the input method for a new client component
* after the input context's removeNotify method has been
* called.</li>
* </ul>
* @param bounds client window's {@link
* java.awt.Component#getBounds bounds} on the screen; or null if
* the client window is iconified or invisible
*/
public void notifyClientWindowChange(Rectangle bounds) {
}
/**
* Activates the input method for immediate input processing.
* <p>
* If an input method provides its own windows, it should make sure
* at this point that all necessary windows are open and visible.
* <p>
* This method is called
* <ul>
* <li>by {@link java.awt.im.InputContext#dispatchEvent InputContext.dispatchEvent}
* when a client component receives a FOCUS_GAINED event,
* <li>when switching to this input method from a different one using the
* user interface or
* {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod}.
* </ul>
* The method is only called when the input method is inactive.
* A newly instantiated input method is assumed to be inactive.
*/
public void activate() {
//System.out.println("activated");
}
/**
* Deactivates the input method.
* The isTemporary argument has the same meaning as in
* {@link java.awt.event.FocusEvent#isTemporary FocusEvent.isTemporary}.
* <p>
* If an input method provides its own windows, only windows that relate
* to the current composition (such as a lookup choice window) should be
* closed at this point.
* It is possible that the input method will be immediately activated again
* for a different client component, and closing and reopening more
* persistent windows (such as a control panel) would create unnecessary
* screen flicker.
* Before an instance of a different input method class is activated,
* {@link #hideWindows} is called on the current input method.
* <p>
* This method is called
* <ul>
* <li>by {@link java.awt.im.InputContext#dispatchEvent InputContext.dispatchEvent}
* when a client component receives a FOCUS_LOST event,
* <li>when switching from this input method to a different one using the
* user interface or
* {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod},
* <li>before {@link #removeNotify removeNotify} if the current client component is
* removed.
* </ul>
* The method is only called when the input method is active.
*
* @param isTemporary whether the focus change is temporary
*/
public void deactivate(boolean isTemporary) {
//System.out.println("deactivated");
}
/**
* Closes or hides all windows opened by this input method instance or
* its class.
* <p>
* This method is called
* <ul>
* <li>before calling {@link #activate activate} on an instance of a different input
* method class,
* <li>before calling {@link #dispose dispose} on this input method.
* </ul>
* The method is only called when the input method is inactive.
*/
public void hideWindows() {
}
/**
* Notifies the input method that a client component has been
* removed from its containment hierarchy, or that input method
* support has been disabled for the component.
* <p>
* This method is called by {@link java.awt.im.InputContext#removeNotify InputContext.removeNotify}.
* <p>
* The method is only called when the input method is inactive.
*/
public void removeNotify() {
}
/**
* Ends any input composition that may currently be going on in this
* context. Depending on the platform and possibly user preferences,
* this may commit or delete uncommitted text. Any changes to the text
* are communicated to the active component using an input method event.
*
* <p>
* A text editing component may call this in a variety of situations,
* for example, when the user moves the insertion point within the text
* (but outside the composed text), or when the component's text is
* saved to a file or copied to the clipboard.
* <p>
* This method is called
* <ul>
* <li>by {@link java.awt.im.InputContext#endComposition InputContext.endComposition},
* <li>by {@link java.awt.im.InputContext#dispatchEvent InputContext.dispatchEvent}
* when switching to a different client component
* <li>when switching from this input method to a different one using the
* user interface or
* {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod}.
* </ul>
*/
public void endComposition() {
impl.endComposition();
}
/**
* Disposes of the input method and releases the resources used by it.
* In particular, the input method should dispose windows and close files that are no
* longer needed.
* <p>
* This method is called by {@link java.awt.im.InputContext#dispose InputContext.dispose}.
* <p>
* The method is only called when the input method is inactive.
* No method of this interface is called on this instance after dispose.
*/
public void dispose() {
}
/**
* Returns a control object from this input method, or null. A
* control object provides methods that control the behavior of the
* input method or obtain information from the input method. The type
* of the object is an input method specific class. Clients have to
* compare the result against known input method control object
* classes and cast to the appropriate class to invoke the methods
* provided.
* <p>
* This method is called by
* {@link java.awt.im.InputContext#getInputMethodControlObject InputContext.getInputMethodControlObject}.
*
* @return a control object from this input method, or null
*/
public Object getControlObject() {
return null;
}
}
/*
* Copyright (c) 2002, 2004, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* (C) Copyright IBM Corp. 2000 - All Rights Reserved
*
* The original version of this source code and documentation is
* copyrighted and owned by IBM. These materials are provided
* under terms of a License Agreement between IBM and Sun.
* This technology is protected by multiple US and International
* patents. This notice and attribution to IBM may not be removed.
*
*/
package com.sun.inputmethods.internal.indicim;
import java.awt.im.spi.InputMethodContext;
import java.awt.event.KeyEvent;
import java.awt.event.InputMethodEvent;
import java.awt.font.TextAttribute;
import java.awt.font.TextHitInfo;
import java.text.AttributedCharacterIterator;
import java.util.Hashtable;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
class IndicInputMethodImpl {
protected char[] KBD_MAP;
private static final char SUBSTITUTION_BASE = '\uff00';
// Indexed by map value - SUBSTITUTION_BASE
protected char[][] SUBSTITUTION_TABLE;
// Invalid character.
private static final char INVALID_CHAR = '\uffff';
// Unmapped versions of some interesting characters.
private static final char KEY_SIGN_VIRAMA = '\u0064'; // or just 'd'??
private static final char KEY_SIGN_NUKTA = '\u005d'; // or just ']'??
// Two succeeding viramas are replaced by one virama and one ZWNJ.
// Viram followed by Nukta is replaced by one VIRAMA and one ZWJ
private static final char ZWJ = '\u200d';
private static final char ZWNJ = '\u200c';
// Backspace
private static final char BACKSPACE = '\u0008';
// Sorted list of characters which can be followed by Nukta
protected char[] JOIN_WITH_NUKTA;
// Nukta form of the above characters
protected char[] NUKTA_FORM;
private int log2;
private int power;
private int extra;
// cached TextHitInfo. Only one type of TextHitInfo is required.
private static final TextHitInfo ZERO_TRAILING_HIT_INFO = TextHitInfo.trailing(0);
/**
* Returns the index of the given character in the JOIN_WITH_NUKTA array.
* If character is not found, -1 is returned.
*/
private int nuktaIndex(char ch) {
if (JOIN_WITH_NUKTA == null) {
return -1;
}
int probe = power;
int index = 0;
if (JOIN_WITH_NUKTA[extra] <= ch) {
index = extra;
}
while (probe > (1 << 0)) {
probe >>= 1;
if (JOIN_WITH_NUKTA[index + probe] <= ch) {
index += probe;
}
}
if (JOIN_WITH_NUKTA[index] != ch) {
index = -1;
}
return index;
}
/**
* Returns the equivalent character for hindi locale.
* @param originalChar The original character.
*/
private char getMappedChar( char originalChar )
{
if (originalChar <= KBD_MAP.length) {
return KBD_MAP[originalChar];
}
return originalChar;
}//getMappedChar()
// Array used to hold the text to be sent.
// If the last character was not committed it is stored in text[0].
// The variable totalChars give an indication of whether the last
// character was committed or not. If at any time ( but not within a
// a call to dispatchEvent ) totalChars is not equal to 0 ( it can
// only be 1 otherwise ) the last character was not committed.
private char [] text = new char[4];
// this is always 0 before and after call to dispatchEvent. This character assumes
// significance only within a call to dispatchEvent.
private int committedChars = 0;// number of committed characters
// the total valid characters in variable text currently.
private int totalChars = 0;//number of total characters ( committed + composed )
private boolean lastCharWasVirama = false;
private InputMethodContext context;
//
// Finds the high bit by binary searching
// through the bits in n.
//
private static byte highBit(int n)
{
if (n <= 0) {
return -32;
}
byte bit = 0;
if (n >= 1 << 16) {
n >>= 16;
bit += 16;
}
if (n >= 1 << 8) {
n >>= 8;
bit += 8;
}
if (n >= 1 << 4) {
n >>= 4;
bit += 4;
}
if (n >= 1 << 2) {
n >>= 2;
bit += 2;
}
if (n >= 1 << 1) {
n >>= 1;
bit += 1;
}
return bit;
}
IndicInputMethodImpl(char[] keyboardMap, char[] joinWithNukta, char[] nuktaForm,
char[][] substitutionTable) {
KBD_MAP = keyboardMap;
JOIN_WITH_NUKTA = joinWithNukta;
NUKTA_FORM = nuktaForm;
SUBSTITUTION_TABLE = substitutionTable;
if (JOIN_WITH_NUKTA != null) {
int log2 = highBit(JOIN_WITH_NUKTA.length);
power = 1 << log2;
extra = JOIN_WITH_NUKTA.length - power;
} else {
power = extra = 0;
}
}
void setInputMethodContext(InputMethodContext context) {
this.context = context;
}
void handleKeyTyped(KeyEvent kevent) {
char keyChar = kevent.getKeyChar();
char currentChar = getMappedChar(keyChar);
// The Explicit and Soft Halanta case.
if ( lastCharWasVirama ) {
switch (keyChar) {
case KEY_SIGN_NUKTA:
currentChar = ZWJ;
break;
case KEY_SIGN_VIRAMA:
currentChar = ZWNJ;
break;
default:
}//endSwitch
}//endif
if (currentChar == INVALID_CHAR) {
kevent.consume();
return;
}
if (currentChar == BACKSPACE) {
lastCharWasVirama = false;
if (totalChars > 0) {
totalChars = committedChars = 0;
} else {
return;
}
}
else if (keyChar == KEY_SIGN_NUKTA) {
int nuktaIndex = nuktaIndex(text[0]);
if (nuktaIndex != -1) {
text[0] = NUKTA_FORM[nuktaIndex];
} else {
// the last character was committed, commit just Nukta.
// Note : the lastChar must have been committed if it is not one of
// the characters which combine with nukta.
// the state must be totalChars = committedChars = 0;
text[totalChars++] = currentChar;
}
committedChars += 1;
}
else {
int nuktaIndex = nuktaIndex(currentChar);
if (nuktaIndex != -1) {
// Commit everything but currentChar
text[totalChars++] = currentChar;
committedChars = totalChars-1;
} else {
if (currentChar >= SUBSTITUTION_BASE) {
char[] sub = SUBSTITUTION_TABLE[currentChar - SUBSTITUTION_BASE];
System.arraycopy(sub, 0, text, totalChars, sub.length);
totalChars += sub.length;
} else {
text[totalChars++] = currentChar;
}
committedChars = totalChars;
}
}
ACIText aText = new ACIText( text, 0, totalChars, committedChars );
int composedCharLength = totalChars - committedChars;
TextHitInfo caret=null,visiblePosition=null;
switch( composedCharLength ) {
case 0:
break;
case 1:
visiblePosition = caret = ZERO_TRAILING_HIT_INFO;
break;
default:
assert false : "The code should not reach here. There is no case where there can be more than one character pending.";
}
context.dispatchInputMethodEvent(InputMethodEvent.INPUT_METHOD_TEXT_CHANGED,
aText,
committedChars,
caret,
visiblePosition);
if (totalChars == 0) {
text[0] = INVALID_CHAR;
} else {
text[0] = text[totalChars - 1];// make text[0] hold the last character
}
lastCharWasVirama = keyChar == KEY_SIGN_VIRAMA && !lastCharWasVirama;
totalChars -= committedChars;
committedChars = 0;
// state now text[0] = last character
// totalChars = ( last character committed )? 0 : 1;
// committedChars = 0;
kevent.consume();// prevent client from getting this event.
}//dispatchEvent()
void endComposition() {
if( totalChars != 0 ) {// if some character is not committed.
ACIText aText = new ACIText( text, 0, totalChars, totalChars );
context.dispatchInputMethodEvent( InputMethodEvent.INPUT_METHOD_TEXT_CHANGED,
aText, totalChars, null, null );
totalChars = committedChars = 0;
text[0] = INVALID_CHAR;
lastCharWasVirama = false;
}//end if
}//endComposition()
// custom AttributedCharacterIterator -- much lightweight since currently there is no
// attribute defined on the text being generated by the input method.
private class ACIText implements AttributedCharacterIterator {
private char [] text = null;
private int committed = 0;
private int index = 0;
ACIText( char [] chArray, int offset, int length, int committed ) {
this.text = new char[length];
this.committed = committed;
System.arraycopy( chArray, offset, text, 0, length );
}//c'tor
// CharacterIterator methods.
public char first() {
return _setIndex( 0 );
}
public char last() {
if( text.length == 0 ) {
return _setIndex( text.length );
}
return _setIndex( text.length - 1 );
}
public char current() {
if( index == text.length )
return DONE;
return text[index];
}
public char next() {
if( index == text.length ) {
return DONE;
}
return _setIndex( index + 1 );
}
public char previous() {
if( index == 0 )
return DONE;
return _setIndex( index - 1 );
}
public char setIndex(int position) {
if( position < 0 || position > text.length ) {
throw new IllegalArgumentException();
}
return _setIndex( position );
}
public int getBeginIndex() {
return 0;
}
public int getEndIndex() {
return text.length;
}
public int getIndex() {
return index;
}
public Object clone() {
try {
ACIText clone = (ACIText) super.clone();
return clone;
} catch (CloneNotSupportedException e) {
throw new InternalError();
}
}
// AttributedCharacterIterator methods.
public int getRunStart() {
return index >= committed ? committed : 0;
}
public int getRunStart(AttributedCharacterIterator.Attribute attribute) {
return (index >= committed &&
attribute == TextAttribute.INPUT_METHOD_UNDERLINE) ? committed : 0;
}
public int getRunStart(Set<? extends Attribute> attributes) {
return (index >= committed &&
attributes.contains(TextAttribute.INPUT_METHOD_UNDERLINE)) ? committed : 0;
}
public int getRunLimit() {
return index < committed ? committed : text.length;
}
public int getRunLimit(AttributedCharacterIterator.Attribute attribute) {
return (index < committed &&
attribute == TextAttribute.INPUT_METHOD_UNDERLINE) ? committed : text.length;
}
public int getRunLimit(Set<? extends Attribute> attributes) {
return (index < committed &&
attributes.contains(TextAttribute.INPUT_METHOD_UNDERLINE)) ? committed : text.length;
}
public Map getAttributes() {
Hashtable result = new Hashtable();
if (index >= committed && committed < text.length) {
result.put(TextAttribute.INPUT_METHOD_UNDERLINE,
TextAttribute.UNDERLINE_LOW_ONE_PIXEL);
}
return result;
}
public Object getAttribute(AttributedCharacterIterator.Attribute attribute) {
if (index >= committed &&
committed < text.length &&
attribute == TextAttribute.INPUT_METHOD_UNDERLINE) {
return TextAttribute.UNDERLINE_LOW_ONE_PIXEL;
}
return null;
}
public Set getAllAttributeKeys() {
HashSet result = new HashSet();
if (committed < text.length) {
result.add(TextAttribute.INPUT_METHOD_UNDERLINE);
}
return result;
}
// private methods
/**
* This is always called with valid i ( 0 < i <= text.length )
*/
private char _setIndex( int i ) {
index = i;
if( i == text.length ) {
return DONE;
}
return text[i];
}//_setIndex()
}//end of inner class
}
#
# Default Input method display names for Indic input methods
#
DisplayName.Devanagari = Devanagari Input Method
#
# Default Input method display names for Indic input methods
#
DisplayName.Devanagari = Devanagari Input Method
#
# Default Input method display names for Indic input methods
#
DisplayName.Devanagari = Devanagari Input Method
#
# Default Input method display names for Indic input methods
#
DisplayName.Devanagari = Devanagari Input Method
#
# Default Input method display names for Indic input methods
#
DisplayName.Devanagari = Devanagari Input Method
#
# Default Input method display names for Indic input methods
#
DisplayName.Devanagari = \u30c7\u30fc\u30f4\u30a1\u30ca\u30fc\u30ac\u30ea\u30fc\u30a4\u30f3\u30d7\u30c3\u30c8\u30e1\u30bd\u30c3\u30c9
#
# Default Input method display names for Indic input methods
#
DisplayName.Devanagari = Devanagari \uc785\ub825 \uba54\uc18c\ub4dc
#
# Default Input method display names for Indic input methods
#
DisplayName.Devanagari = Devanagari Input Method
#
# Default Input method display names for Indic input methods
#
DisplayName.Devanagari = Devanagari \u8f93\u5165\u6cd5
#
# Default Input method display names for Indic input methods
#
DisplayName.Devanagari = Devanagari \u8f38\u5165\u6cd5
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
*
* (C) Copyright IBM Corp. 2000 - All Rights Reserved
*
* The original version of this source code and documentation is
* copyrighted and owned by IBM. These materials are provided
* under terms of a License Agreement between IBM and Sun.
* This technology is protected by multiple US and International
* patents. This notice and attribution to IBM may not be removed.
*
*/
package com.sun.inputmethods.internal.thaiim;
import java.awt.im.spi.InputMethod;
import java.awt.im.spi.InputMethodContext;
import java.awt.AWTEvent;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.lang.Character.Subset;
import java.util.Locale;
class ThaiInputMethod implements InputMethod {
private ThaiInputMethodImpl impl;
private Locale locale;
ThaiInputMethod(Locale theLocale, ThaiInputMethodImpl theImplementation) {
locale = theLocale;
impl = theImplementation;
}
/**
* Sets the input method context, which is used to dispatch input method
* events to the client component and to request information from
* the client component.
* <p>
* This method is called once immediately after instantiating this input
* method.
*
* @param context the input method context for this input method
* @exception NullPointerException if <code>context</code> is null
*/
public void setInputMethodContext(InputMethodContext context) {
impl.setInputMethodContext(context);
}
/**
* Attempts to set the input locale. If the input method supports the
* desired locale, it changes its behavior to support input for the locale
* and returns true.
* Otherwise, it returns false and does not change its behavior.
* <p>
* This method is called
* <ul>
* <li>by {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod},
* <li>when switching to this input method through the user interface if the user
* specified a locale or if the previously selected input method's
* {@link java.awt.im.spi.InputMethod#getLocale getLocale} method
* returns a non-null value.
* </ul>
*
* @param locale locale to input
* @return whether the specified locale is supported
* @exception NullPointerException if <code>locale</code> is null
*/
public boolean setLocale(Locale locale) {
if (locale.getLanguage().equals(this.locale.getLanguage())) {
//System.out.println("returning true for locale " + locale);
return true;
}
else {
//System.out.println("returning false for locale " + locale);
return false;
}
}
/**
* Returns the current input locale. Might return null in exceptional cases.
* <p>
* This method is called
* <ul>
* <li>by {@link java.awt.im.InputContext#getLocale InputContext.getLocale} and
* <li>when switching from this input method to a different one through the
* user interface.
* </ul>
*
* @return the current input locale, or null
*/
public Locale getLocale() {
return locale;
}
/**
* Sets the subsets of the Unicode character set that this input method
* is allowed to input. Null may be passed in to indicate that all
* characters are allowed.
* <p>
* This method is called
* <ul>
* <li>immediately after instantiating this input method,
* <li>when switching to this input method from a different one, and
* <li>by {@link java.awt.im.InputContext#setCharacterSubsets InputContext.setCharacterSubsets}.
* </ul>
*
* @param subsets the subsets of the Unicode character set from which
* characters may be input
*/
public void setCharacterSubsets(Subset[] subsets) {
}
/**
* Enables or disables this input method for composition,
* depending on the value of the parameter <code>enable</code>.
* <p>
* An input method that is enabled for composition interprets incoming
* events for both composition and control purposes, while a
* disabled input method does not interpret events for composition.
* Note however that events are passed on to the input method regardless
* whether it is enabled or not, and that an input method that is disabled
* for composition may still interpret events for control purposes,
* including to enable or disable itself for composition.
* <p>
* This method is called
* <ul>
* <li>by {@link java.awt.im.InputContext#setCompositionEnabled InputContext.setCompositionEnabled},
* <li>when switching to this input method from a different one using the
* user interface or
* {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod},
* if the previously selected input method's
* {@link java.awt.im.spi.InputMethod#isCompositionEnabled isCompositionEnabled}
* method returns without throwing an exception.
* </ul>
*
* @param enable whether to enable the input method for composition
* @throws UnsupportedOperationException if this input method does not
* support the enabling/disabling operation
* @see #isCompositionEnabled
*/
public void setCompositionEnabled(boolean enable) {
throw new UnsupportedOperationException();
}
/**
* Determines whether this input method is enabled.
* An input method that is enabled for composition interprets incoming
* events for both composition and control purposes, while a
* disabled input method does not interpret events for composition.
* <p>
* This method is called
* <ul>
* <li>by {@link java.awt.im.InputContext#isCompositionEnabled InputContext.isCompositionEnabled} and
* <li>when switching from this input method to a different one using the
* user interface or
* {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod}.
* </ul>
*
* @return <code>true</code> if this input method is enabled for
* composition; <code>false</code> otherwise.
* @throws UnsupportedOperationException if this input method does not
* support checking whether it is enabled for composition
* @see #setCompositionEnabled
*/
public boolean isCompositionEnabled() {
return true;
}
/**
* Starts the reconversion operation. The input method obtains the
* text to be reconverted from the current client component using the
* {@link java.awt.im.InputMethodRequests#getSelectedText InputMethodRequests.getSelectedText}
* method. It can use other <code>InputMethodRequests</code>
* methods to request additional information required for the
* reconversion operation. The composed and committed text
* produced by the operation is sent to the client component as a
* sequence of <code>InputMethodEvent</code>s. If the given text
* cannot be reconverted, the same text should be sent to the
* client component as committed text.
* <p>
* This method is called by
* {@link java.awt.im.InputContext#reconvert() InputContext.reconvert}.
*
* @throws UnsupportedOperationException if the input method does not
* support the reconversion operation.
*/
public void reconvert() {
throw new UnsupportedOperationException("This input method does not reconvert.");
}
/**
* Dispatches the event to the input method. If input method support is
* enabled for the focussed component, incoming events of certain types
* are dispatched to the current input method for this component before
* they are dispatched to the component's methods or event listeners.
* The input method decides whether it needs to handle the event. If it
* does, it also calls the event's <code>consume</code> method; this
* causes the event to not get dispatched to the component's event
* processing methods or event listeners.
* <p>
* Events are dispatched if they are instances of InputEvent or its
* subclasses.
* This includes instances of the AWT classes KeyEvent and MouseEvent.
* <p>
* This method is called by {@link java.awt.im.InputContext#dispatchEvent InputContext.dispatchEvent}.
*
* @param event the event being dispatched to the input method
* @exception NullPointerException if <code>event</code> is null
*/
public void dispatchEvent(AWTEvent event) {
if (event instanceof KeyEvent) {
KeyEvent keyEvent = (KeyEvent) event;
if (event.getID() == KeyEvent.KEY_TYPED) {
//System.out.println("handled event " + event);
impl.handleKeyTyped(keyEvent);
}
}
else {
//System.out.println("did not handle event " + event);
}
}
/**
* Notifies this input method of changes in the client window
* location or state. This method is called while this input
* method is the current input method of its input context and
* notifications for it are enabled (see {@link
* InputMethodContext#enableClientWindowNotification
* InputMethodContext.enableClientWindowNotification}). Calls
* to this method are temporarily suspended if the input context's
* {@link java.awt.im.InputContext#removeNotify removeNotify}
* method is called, and resume when the input method is activated
* for a new client component. It is called in the following
* situations:
* <ul>
* <li>
* when the window containing the current client component changes
* in location, size, visibility, iconification state, or when the
* window is closed.</li>
* <li>
* from <code> enableClientWindowNotification(inputMethod,
* true)</code> if the current client component exists,</li>
* <li>
* when activating the input method for the first time after it
* called
* <code>enableClientWindowNotification(inputMethod,
* true)</code> if during the call no current client component was
* available,</li>
* <li>
* when activating the input method for a new client component
* after the input context's removeNotify method has been
* called.</li>
* </ul>
* @param bounds client window's {@link
* java.awt.Component#getBounds bounds} on the screen; or null if
* the client window is iconified or invisible
*/
public void notifyClientWindowChange(Rectangle bounds) {
}
/**
* Activates the input method for immediate input processing.
* <p>
* If an input method provides its own windows, it should make sure
* at this point that all necessary windows are open and visible.
* <p>
* This method is called
* <ul>
* <li>by {@link java.awt.im.InputContext#dispatchEvent InputContext.dispatchEvent}
* when a client component receives a FOCUS_GAINED event,
* <li>when switching to this input method from a different one using the
* user interface or
* {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod}.
* </ul>
* The method is only called when the input method is inactive.
* A newly instantiated input method is assumed to be inactive.
*/
public void activate() {
//System.out.println("activated");
}
/**
* Deactivates the input method.
* The isTemporary argument has the same meaning as in
* {@link java.awt.event.FocusEvent#isTemporary FocusEvent.isTemporary}.
* <p>
* If an input method provides its own windows, only windows that relate
* to the current composition (such as a lookup choice window) should be
* closed at this point.
* It is possible that the input method will be immediately activated again
* for a different client component, and closing and reopening more
* persistent windows (such as a control panel) would create unnecessary
* screen flicker.
* Before an instance of a different input method class is activated,
* {@link #hideWindows} is called on the current input method.
* <p>
* This method is called
* <ul>
* <li>by {@link java.awt.im.InputContext#dispatchEvent InputContext.dispatchEvent}
* when a client component receives a FOCUS_LOST event,
* <li>when switching from this input method to a different one using the
* user interface or
* {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod},
* <li>before {@link #removeNotify removeNotify} if the current client component is
* removed.
* </ul>
* The method is only called when the input method is active.
*
* @param isTemporary whether the focus change is temporary
*/
public void deactivate(boolean isTemporary) {
//System.out.println("deactivated");
}
/**
* Closes or hides all windows opened by this input method instance or
* its class.
* <p>
* This method is called
* <ul>
* <li>before calling {@link #activate activate} on an instance of a different input
* method class,
* <li>before calling {@link #dispose dispose} on this input method.
* </ul>
* The method is only called when the input method is inactive.
*/
public void hideWindows() {
}
/**
* Notifies the input method that a client component has been
* removed from its containment hierarchy, or that input method
* support has been disabled for the component.
* <p>
* This method is called by {@link java.awt.im.InputContext#removeNotify InputContext.removeNotify}.
* <p>
* The method is only called when the input method is inactive.
*/
public void removeNotify() {
}
/**
* Ends any input composition that may currently be going on in this
* context. Depending on the platform and possibly user preferences,
* this may commit or delete uncommitted text. Any changes to the text
* are communicated to the active component using an input method event.
*
* <p>
* A text editing component may call this in a variety of situations,
* for example, when the user moves the insertion point within the text
* (but outside the composed text), or when the component's text is
* saved to a file or copied to the clipboard.
* <p>
* This method is called
* <ul>
* <li>by {@link java.awt.im.InputContext#endComposition InputContext.endComposition},
* <li>by {@link java.awt.im.InputContext#dispatchEvent InputContext.dispatchEvent}
* when switching to a different client component
* <li>when switching from this input method to a different one using the
* user interface or
* {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod}.
* </ul>
*/
public void endComposition() {
impl.endComposition();
}
/**
* Disposes of the input method and releases the resources used by it.
* In particular, the input method should dispose windows and close files that are no
* longer needed.
* <p>
* This method is called by {@link java.awt.im.InputContext#dispose InputContext.dispose}.
* <p>
* The method is only called when the input method is inactive.
* No method of this interface is called on this instance after dispose.
*/
public void dispose() {
}
/**
* Returns a control object from this input method, or null. A
* control object provides methods that control the behavior of the
* input method or obtain information from the input method. The type
* of the object is an input method specific class. Clients have to
* compare the result against known input method control object
* classes and cast to the appropriate class to invoke the methods
* provided.
* <p>
* This method is called by
* {@link java.awt.im.InputContext#getInputMethodControlObject InputContext.getInputMethodControlObject}.
*
* @return a control object from this input method, or null
*/
public Object getControlObject() {
return null;
}
}
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
*
* (C) Copyright IBM Corp. 2000 - All Rights Reserved
*
* The original version of this source code and documentation is
* copyrighted and owned by IBM. These materials are provided
* under terms of a License Agreement between IBM and Sun.
* This technology is protected by multiple US and International
* patents. This notice and attribution to IBM may not be removed.
*
*/
package com.sun.inputmethods.internal.thaiim;
import java.awt.Image;
import java.awt.im.spi.InputMethod;
import java.awt.im.spi.InputMethodDescriptor;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
public class ThaiInputMethodDescriptor implements InputMethodDescriptor {
static final Locale THAI = new Locale("th");
public ThaiInputMethodDescriptor() {
}
/**
* @see java.awt.im.spi.InputMethodDescriptor#getAvailableLocales
*/
public Locale[] getAvailableLocales() {
return new Locale[] { THAI };
}
/**
* @see java.awt.im.spi.InputMethodDescriptor#hasDynamicLocaleList
*/
public boolean hasDynamicLocaleList() {
return false;
}
/**
* @see java.awt.im.spi.InputMethodDescriptor#getInputMethodDisplayName
*/
public synchronized String getInputMethodDisplayName(Locale inputLocale, Locale displayLanguage) {
try {
ResourceBundle resources = ResourceBundle.getBundle(
"com.sun.inputmethods.internal.thaiim.resources.DisplayNames", displayLanguage);
return resources.getString("DisplayName.Thai");
} catch (MissingResourceException mre) {
return "Thai Input Method";
}
}
/**
* @see java.awt.im.spi.InputMethodDescriptor#getInputMethodIcon
*/
public Image getInputMethodIcon(Locale inputLocale) {
return null;
}
/**
* @see java.awt.im.spi.InputMethodDescriptor#createInputMethod
*/
public InputMethod createInputMethod() throws Exception {
ThaiInputMethodImpl impl = new ThaiInputMethodImpl();
return new ThaiInputMethod(THAI, impl);
}
public String toString() {
return getClass().getName();
}
}
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
*
* (C) Copyright IBM Corp. 2000 - All Rights Reserved
*
* The original version of this source code and documentation is
* copyrighted and owned by IBM. These materials are provided
* under terms of a License Agreement between IBM and Sun.
* This technology is protected by multiple US and International
* patents. This notice and attribution to IBM may not be removed.
*
*/
package com.sun.inputmethods.internal.thaiim;
import java.awt.im.InputMethodRequests;
import java.awt.im.spi.InputMethodContext;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.InputMethodEvent;
import java.awt.font.TextAttribute;
import java.awt.font.TextHitInfo;
import java.text.AttributedCharacterIterator;
import java.text.AttributedString;
class ThaiInputMethodImpl {
private static final char[] keyboardMap = {
/* 00 */ '\u0000',
/* 01 */ '\u0001',
/* 02 */ '\u0002',
/* 03 */ '\u0003',
/* 04 */ '\u0004',
/* 05 */ '\u0005',
/* 06 */ '\u0006',
/* 07 */ '\u0007',
/* 08 */ '\u0008',
/* 09 */ '\u0009',
/* 0A */ '\012',
/* 0B */ '\u000B',
/* 0C */ '\u000C',
/* 0D */ '\015',
/* 0E */ '\u000E',
/* 0F */ '\u000F',
/* 10 */ '\u0010',
/* 11 */ '\u0011',
/* 12 */ '\u0012',
/* 13 */ '\u0013',
/* 14 */ '\u0014',
/* 15 */ '\u0015',
/* 16 */ '\u0016',
/* 17 */ '\u0017',
/* 18 */ '\u0018',
/* 19 */ '\u0019',
/* 1A */ '\u001A',
/* 1B */ '\u001B',
/* 1C */ '\u001C',
/* 1D */ '\u001D',
/* 1E */ '\u001E',
/* 1F */ '\u001F',
/* 20 */ '\u0020',
/* 21 */ '\u0e45', // '!'
/* 22 */ '\u002e', // '"'
/* 23 */ '\u0e52', // '#'
/* 24 */ '\u0e53', // '$'
/* 25 */ '\u0e54', // '%'
/* 26 */ '\u0e4e', // '&'
/* 27 */ '\u0e07', // '''
/* 28 */ '\u0e56', // '('
/* 29 */ '\u0e57', // ')'
/* 2A */ '\u0e55', // '*'
/* 2B */ '\u0e59', // '+'
/* 2C */ '\u0e21', // ','
/* 2D */ '\u0e02', // '-'
/* 2E */ '\u0e43', // '.'
/* 2F */ '\u0e1d', // '/'
/* 30 */ '\u0e08', // '0'
/* 31 */ '\u0e3f', // '1'
/* 32 */ '\u002f', // '2'
/* 33 */ '\u002d', // '3'
/* 34 */ '\u0e20', // '4'
/* 35 */ '\u0e16', // '5'
/* 36 */ '\u0e38', // '6'
/* 37 */ '\u0e36', // '7'
/* 38 */ '\u0e04', // '8'
/* 39 */ '\u0e15', // '9'
/* 3A */ '\u0e0b', // ':'
/* 3B */ '\u0e27', // ';'
/* 3C */ '\u0e12', // '<'
/* 3D */ '\u0e0a', // '='
/* 3E */ '\u0e2c', // '>'
/* 3F */ '\u0e26', // '?'
/* 40 */ '\u0e51', // '@'
/* 41 */ '\u0e24', // 'A'
/* 42 */ '\u0e3a', // 'B'
/* 43 */ '\u0e09', // 'C'
/* 44 */ '\u0e0f', // 'D'
/* 45 */ '\u0e0e', // 'E'
/* 46 */ '\u0e42', // 'F'
/* 47 */ '\u0e0c', // 'G'
/* 48 */ '\u0e47', // 'H'
/* 49 */ '\u0e13', // 'I'
/* 4A */ '\u0e4b', // 'J'
/* 4B */ '\u0e29', // 'K'
/* 4C */ '\u0e28', // 'L'
/* 4D */ '\u003f', // 'M'
/* 4E */ '\u0e4c', // 'N'
/* 4F */ '\u0e2f', // 'O'
/* 50 */ '\u0e0d', // 'P'
/* 51 */ '\u0e50', // 'Q'
/* 52 */ '\u0e11', // 'R'
/* 53 */ '\u0e06', // 'S'
/* 54 */ '\u0e18', // 'T'
/* 55 */ '\u0e4a', // 'U'
/* 56 */ '\u0e2e', // 'V'
/* 57 */ '\u0022', // 'W'
/* 58 */ '\u0029', // 'X'
/* 59 */ '\u0e4d', // 'Y'
/* 5A */ '\u0028', // 'Z'
/* 5B */ '\u0e1a', // '['
/* 5C */ '\u0e05', // '\'
/* 5D */ '\u0e25', // ']'
/* 5E */ '\u0e39', // '^'
/* 5F */ '\u0e58', // '_'
/* 60 */ '\u0e4f', // '`'
/* 61 */ '\u0e1f', // 'a'
/* 62 */ '\u0e34', // 'b'
/* 63 */ '\u0e41', // 'c'
/* 64 */ '\u0e01', // 'd'
/* 65 */ '\u0e33', // 'e'
/* 66 */ '\u0e14', // 'f'
/* 67 */ '\u0e40', // 'g'
/* 68 */ '\u0e49', // 'h'
/* 69 */ '\u0e23', // 'i'
/* 6A */ '\u0e48', // 'j'
/* 6B */ '\u0e32', // 'k'
/* 6C */ '\u0e2a', // 'l'
/* 6D */ '\u0e17', // 'm'
/* 6E */ '\u0e37', // 'n'
/* 6F */ '\u0e19', // 'o'
/* 70 */ '\u0e22', // 'p'
/* 71 */ '\u0e46', // 'q'
/* 72 */ '\u0e1e', // 'r'
/* 73 */ '\u0e2b', // 's'
/* 74 */ '\u0e30', // 't'
/* 75 */ '\u0e35', // 'u'
/* 76 */ '\u0e2d', // 'v'
/* 77 */ '\u0e44', // 'w'
/* 78 */ '\u0e1b', // 'x'
/* 79 */ '\u0e31', // 'y'
/* 7A */ '\u0e1c', // 'z'
/* 7B */ '\u0e10', // '{'
/* 7C */ '\u0e03', // '|'
/* 7D */ '\u002c', // '}'
/* 7E */ '\u0e5b', // '~'
/* 7F */ '\u007F' //
};
// cached TextHitInfo. Only one type of TextHitInfo is required.
private static final TextHitInfo ZERO_TRAILING_HIT_INFO = TextHitInfo.trailing(0);
private ThaiRules rules;
/**
* Returns the equivalent character for thai locale.
* @param originalChar The original character.
*/
private char getMappedChar( char originalChar )
{
if (originalChar <= keyboardMap.length) {
return keyboardMap[originalChar];
}
return originalChar;
}//getMappedChar()
private InputMethodContext context;
void setInputMethodContext(InputMethodContext context) {
this.context = context;
rules = new ThaiRules((InputMethodRequests)context);
}
void handleKeyTyped(KeyEvent kevent) {
char keyChar = kevent.getKeyChar();
char currentChar = getMappedChar(keyChar);
if (!Character.UnicodeBlock.THAI.equals(Character.UnicodeBlock.of(currentChar))) {
// don't care
return;
} else if (rules.isInputValid(currentChar)) {
Character tmp = new Character(currentChar);
String tmp2 = tmp.toString();
context.dispatchInputMethodEvent(InputMethodEvent.INPUT_METHOD_TEXT_CHANGED,
(new AttributedString(tmp2)).getIterator(),
1,
ZERO_TRAILING_HIT_INFO,
ZERO_TRAILING_HIT_INFO);
} else {
// input sequence is not allowed
Toolkit.getDefaultToolkit().beep();
}
kevent.consume();// prevent client from getting this event.
return;
}//dispatchEvent()
void endComposition() {
}//endComposition()
}
/*
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.inputmethods.internal.thaiim;
import java.awt.im.InputMethodRequests;
public class ThaiRules {
public static final char BASE = 0x0e00;
public static final byte NON = 0;
public static final byte CONS = 1;
public static final byte LV = 2;
public static final byte FV1 = 3;
public static final byte FV2 = 4;
public static final byte FV3 = 5;
public static final byte FV4 = 6;
/* Note that FV4 is added. It is not in WTT.
* We need it for SARA AM since it has a
* weired characteristic to share the same
* cell with whatever consonant preceeds it.
*/
public static final byte BV1 = 7;
public static final byte BV2 = 8;
public static final byte BD = 9;
public static final byte TONE = 10;
public static final byte AD1 = 11;
public static final byte AD2 = 12;
public static final byte AD3 = 13;
public static final byte AV1 = 14;
public static final byte AV2 = 15;
public static final byte AV3 = 16;
/**
* Constants for validity checking and auto correction
*/
public static final byte STRICT = 0;
public static final byte LOOSE = 1;
public static final byte NOREPLACE = 2;
public static final byte[] CHARTYPE = {
/* 0e00 UNUSED */ NON,
/* THAI CHARACTER KO KAI */ CONS,
/* THAI CHARACTER KHO KHAI */ CONS,
/* THAI CHARACTER KHO KHUAT */ CONS,
/* THAI CHARACTER KHO KHWAI */ CONS,
/* THAI CHARACTER KHO KHON */ CONS,
/* THAI CHARACTER KHO RAKHANG */ CONS,
/* THAI CHARACTER NGO NGU */ CONS,
/* THAI CHARACTER CHO CHAN */ CONS,
/* THAI CHARACTER CHO CHING */ CONS,
/* THAI CHARACTER CHO CHANG */ CONS,
/* THAI CHARACTER SO SO */ CONS,
/* THAI CHARACTER CHO CHOE */ CONS,
/* THAI CHARACTER YO YING */ CONS,
/* THAI CHARACTER DO CHADA */ CONS,
/* THAI CHARACTER TO PATAK */ CONS,
/* THAI CHARACTER THO THAN */ CONS,
/* THAI CHARACTER THO NANGMONTHO */ CONS,
/* THAI CHARACTER THO PHUTHAO */ CONS,
/* THAI CHARACTER NO NEN */ CONS,
/* THAI CHARACTER DO DEK */ CONS,
/* THAI CHARACTER TO TAO */ CONS,
/* THAI CHARACTER THO THUNG */ CONS,
/* THAI CHARACTER THO THAHAN */ CONS,
/* THAI CHARACTER THO THONG */ CONS,
/* THAI CHARACTER NO NU */ CONS,
/* THAI CHARACTER BO BAIMAI */ CONS,
/* THAI CHARACTER PO PLA */ CONS,
/* THAI CHARACTER PHO PHUNG */ CONS,
/* THAI CHARACTER FO FA */ CONS,
/* THAI CHARACTER PHO PHAN */ CONS,
/* THAI CHARACTER FO FAN */ CONS,
/* THAI CHARACTER PHO SAMPHAO */ CONS,
/* THAI CHARACTER MO MA */ CONS,
/* THAI CHARACTER YO YAK */ CONS,
/* THAI CHARACTER RO RUA */ CONS,
/* THAI CHARACTER RU */ FV3,
/* THAI CHARACTER LO LING */ CONS,
/* THAI CHARACTER LU */ FV3,
/* THAI CHARACTER WO WAEN */ CONS,
/* THAI CHARACTER SO SALA */ CONS,
/* THAI CHARACTER SO RUSI */ CONS,
/* THAI CHARACTER SO SUA */ CONS,
/* THAI CHARACTER HO HIP */ CONS,
/* THAI CHARACTER LO CHULA */ CONS,
/* THAI CHARACTER O ANG */ CONS,
/* THAI CHARACTER HO NOKHUK */ CONS,
/* THAI CHARACTER PAIYANNOI */ NON,
/* THAI CHARACTER SARA A */ FV1,
/* THAI CHARACTER MAI HAN-AKAT */ AV2,
/* THAI CHARACTER SARA AA */ FV1,
/* THAI CHARACTER SARA AM */ FV4,
/* THAI CHARACTER SARA I */ AV1,
/* THAI CHARACTER SARA II */ AV3,
/* THAI CHARACTER SARA UE */ AV2,
/* THAI CHARACTER SARA UEE */ AV3,
/* THAI CHARACTER SARA U */ BV1,
/* THAI CHARACTER SARA UU */ BV2,
/* THAI CHARACTER PHINTHU */ BD,
/* 0e3b UNUSED */ NON,
/* 0e3c UNUSED */ NON,
/* 0e3d UNUSED */ NON,
/* 0e3e UNUSED */ NON,
/* THAI CURRENCY SYMBOL BAHT */ NON,
/* THAI CHARACTER SARA E */ LV,
/* THAI CHARACTER SARA AE */ LV,
/* THAI CHARACTER SARA O */ LV,
/* THAI CHARACTER SARA AI MAIMUAN */ LV,
/* THAI CHARACTER SARA AI MAIMALAI */ LV,
/* THAI CHARACTER LAKKHANGYAO */ FV2,
/* THAI CHARACTER MAIYAMOK */ NON,
/* THAI CHARACTER MAITAIKHU */ AD2,
/* THAI CHARACTER MAI EK */ TONE,
/* THAI CHARACTER MAI THO */ TONE,
/* THAI CHARACTER MAI TRI */ TONE,
/* THAI CHARACTER MAI CHATTAWA */ TONE,
/* THAI CHARACTER THANTHAKHAT */ AD1,
/* THAI CHARACTER NIKHAHIT */ AD3,
/* THAI CHARACTER YAMAKKAN */ AD3,
/* THAI CHARACTER FONGMAN */ NON,
/* THAI DIGIT ZERO */ NON,
/* THAI DIGIT ONE */ NON,
/* THAI DIGIT TWO */ NON,
/* THAI DIGIT THREE */ NON,
/* THAI DIGIT FOUR */ NON,
/* THAI DIGIT FIVE */ NON,
/* THAI DIGIT SIX */ NON,
/* THAI DIGIT SEVEN */ NON,
/* THAI DIGIT EIGHT */ NON,
/* THAI DIGIT NINE */ NON,
/* THAI CHARACTER ANGKHANKHU */ NON,
/* THAI CHARACTER KHOMUT */ NON
};
private InputMethodRequests requests;
ThaiRules(InputMethodRequests requests) {
this.requests = requests;
}
public static byte getCharType(char c) {
byte cType;
int ci = ((int) c) - (int) BASE;
if (ci < 0 || ci >= CHARTYPE.length)
cType = NON;
else
cType = CHARTYPE[ci];
return cType;
}
private static boolean isValid(char c1, char c2, int[] validityArray) {
return ((validityArray[getCharType(c1)]
& (1 << getCharType(c2))) != 0);
}
/**
* VALIDITY is a bit matrix defining whether one
* character is allowed to be typed in after the
* previous one (array index). Determining the
* validity is done by bit-anding the 2nd char
* type's mask (obtained by 1 << chartype) with
* the array element indexed by the first char
* type. If the result is non-zero, the 2nd
* character is allowed to follow the first.
*/
/* Please note that the bits in the comment below
* are displayed least significant bit first.
* The actual value reflexs this representation
* when the bits are swapped.
*/
private static final int[] INPUTVALIDITY = {
/* NON 1110 010 0 0000 0000 0 */ 0x00027,
/* CONS 1111 111 1 1111 1111 1 */ 0x1ffff,
/* LV 0100 000 0 0000 0000 0 */ 0x00002,
/* FV1 1110 010 0 0000 0000 0 */ 0x00027,
/* FV2 1110 010 0 0000 0000 0 */ 0x00027,
/* FV3 1110 110 0 0000 0000 0 */ 0x00037,
/* FV4 1110 010 0 0000 0000 0 */ 0x00027,
/* BV1 1110 010 0 0011 0000 0 */ 0x00c27,
/* BV2 1110 010 0 0010 0000 0 */ 0x00427,
/* BD 1110 010 0 0000 0000 0 */ 0x00027,
/* TONE 1111 011 0 0000 0000 0 */ 0x0006f,
/* AD1 1110 010 0 0000 0000 0 */ 0x00027,
/* AD2 1110 010 0 0000 0000 0 */ 0x00027,
/* AD3 1110 010 0 0000 0000 0 */ 0x00027,
/* AV1 1110 010 0 0011 0000 0 */ 0x00c27,
/* AV2 1110 010 0 0010 0000 0 */ 0x00427,
/* AV3 1110 010 0 0010 0100 0 */ 0x02427
};
private static final int[] COMPOSABLE = {
/* NON 0000 000 0 0000 0000 0 */ 0x00000,
/* CONS 0000 001 1 1111 1111 1 */ 0x1ffc0,
/* LV 0000 000 0 0000 0000 0 */ 0x00000,
/* FV1 0000 000 0 0000 0000 0 */ 0x00000,
/* FV2 0000 000 0 0000 0000 0 */ 0x00000,
/* FV3 0000 000 0 0000 0000 0 */ 0x00000,
/* FV4 0000 000 0 0000 0000 0 */ 0x00000,
/* BV1 0000 000 0 0011 0000 0 */ 0x00c00,
/* BV2 0000 000 0 0010 0000 0 */ 0x00400,
/* BD 0000 000 0 0000 0000 0 */ 0x00000,
/* TONE 0000 001 0 0000 0000 0 */ 0x00040,
/* AD1 0000 000 0 0000 0000 0 */ 0x00000,
/* AD2 0000 000 0 0000 0000 0 */ 0x00000,
/* AD3 0000 000 0 0000 0000 0 */ 0x00000,
/* AV1 0000 000 0 0011 0000 0 */ 0x00c00,
/* AV2 0000 000 0 0010 0000 0 */ 0x00400,
/* AV3 0000 000 0 0010 0100 0 */ 0x02400
};
private static final int[] REPLACABLE = {
/* NON 0000 000 0 0000 0000 0 */ 0x00000,
/* CONS 0000 000 0 0000 0000 0 */ 0x00000,
/* LV 0000 000 0 0000 0000 0 */ 0x00000,
/* FV1 0000 000 0 0000 0000 0 */ 0x00000,
/* FV2 0000 000 0 0000 0000 0 */ 0x00000,
/* FV3 0000 000 0 0000 0000 0 */ 0x00000,
/* FV4 0000 001 1 1001 1111 1 */ 0x1f9c0,
/* BV1 0000 001 1 1100 1111 1 */ 0x1f3c0,
/* BV2 0000 001 1 1101 1111 1 */ 0x1fbc0,
/* BD 0000 001 1 1111 1111 1 */ 0x1ffc0,
/* TONE 0000 000 0 0111 1100 0 */ 0x03e00,
/* AD1 0000 001 0 1111 1101 1 */ 0x1bf40,
/* AD2 0000 001 1 1111 1111 1 */ 0x1ffc0,
/* AD3 0000 001 1 1111 1111 0 */ 0x0ffc0,
/* AV1 0000 001 1 1100 1111 1 */ 0x1f3c0,
/* AV2 0000 001 1 1101 1111 1 */ 0x1fbc0,
/* AV3 0000 001 1 1101 1011 1 */ 0x1dbc0
};
private static final int[] SWAPPABLE = {
/* NON 0000 000 0 0000 0000 0 */ 0x00000,
/* CONS 0000 000 0 0000 0000 0 */ 0x00000,
/* LV 0000 000 0 0000 0000 0 */ 0x00000,
/* FV1 0000 000 0 0000 0000 0 */ 0x00000,
/* FV2 0000 000 0 0000 0000 0 */ 0x00000,
/* FV3 0000 000 0 0000 0000 0 */ 0x00000,
/* FV4 0000 000 0 0010 0000 0 */ 0x00400,
/* BV1 0000 000 0 0000 0000 0 */ 0x00000,
/* BV2 0000 000 0 0000 0000 0 */ 0x00000,
/* BD 0000 000 0 0000 0000 0 */ 0x00000,
/* TONE 0000 000 1 1000 0011 1 */ 0x1c180,
/* AD1 0000 000 1 0000 0010 0 */ 0x04080,
/* AD2 0000 000 0 0000 0000 0 */ 0x00000,
/* AD3 0000 000 0 0000 0000 1 */ 0x10000,
/* AV1 0000 000 0 0000 0000 0 */ 0x00000,
/* AV2 0000 000 0 0000 0000 0 */ 0x00000,
/* AV3 0000 000 0 0000 0000 0 */ 0x00000
};
public static boolean isInputValid(char c1, char c2) {
return isValid(c1, c2, INPUTVALIDITY);
}
public static boolean isComposable(char c1, char c2) {
return isValid(c1, c2, COMPOSABLE);
}
public static boolean isSwappable(char c1, char c2) {
return isValid(c1, c2, SWAPPABLE);
}
public static boolean isReplacable(char c1, char c2) {
return isValid(c1, c2, REPLACABLE);
}
public static boolean isForward(char c) {
return (getCharType(c) < FV4);
}
public static boolean isDead(char c) {
return (getCharType(c) > FV3);
}
public boolean isInputValid(char current) {
int offset = requests.getInsertPositionOffset();
if (offset == 0) {
byte charType = getCharType(current);
return ((charType < FV1) || (charType == FV3));
}
else {
char prev = requests.getCommittedText(offset-1, offset, null).first();
if(isForward(current)) {
if (isInputValid(prev, current)) {
if (getCharType(prev) == TONE &&
getCharType(current) == FV1) {
if (offset == 1) {
return true;
} else {
char pprev =
requests.getCommittedText(offset-2, offset-1, null).first();
return isInputValid(pprev, current);
}
} else {
return true;
}
} else if (prev == '\u0e32' && // SARA AA
current == '\u0e30') { // SARA A
return true;
} else if (prev == '\u0e4d' && // NIKAHIT
current == '\u0e32') { // SARA AA
// Special compose to SARA AM
return true;
} else {
return false;
}
} else {
if(isInputValid(prev, current)) {
if (getCharType(prev) == TONE &&
getCharType(current) == FV4) {
return (offset != 1);
} else {
return true;
}
} else {
return false;
}
}
}
}
}
#
# Default Input method display names for Thai input methods
#
DisplayName.Thai = Thai Input Method
...@@ -35,6 +35,7 @@ import javax.swing.table.*; ...@@ -35,6 +35,7 @@ import javax.swing.table.*;
import static com.sun.java.swing.plaf.windows.TMSchema.*; import static com.sun.java.swing.plaf.windows.TMSchema.*;
import static com.sun.java.swing.plaf.windows.XPStyle.*; import static com.sun.java.swing.plaf.windows.XPStyle.*;
import sun.swing.table.*; import sun.swing.table.*;
import sun.swing.SwingUtilities2;
public class WindowsTableHeaderUI extends BasicTableHeaderUI { public class WindowsTableHeaderUI extends BasicTableHeaderUI {
...@@ -163,18 +164,13 @@ public class WindowsTableHeaderUI extends BasicTableHeaderUI { ...@@ -163,18 +164,13 @@ public class WindowsTableHeaderUI extends BasicTableHeaderUI {
return this; return this;
} }
private int viewIndexForColumn(TableColumn aColumn) {
if (aColumn != null) {
return header.getTable().convertColumnIndexToView(
aColumn.getModelIndex());
}
return -1;
}
public void paint(Graphics g) { public void paint(Graphics g) {
Dimension size = getSize(); Dimension size = getSize();
State state = State.NORMAL; State state = State.NORMAL;
if (column == viewIndexForColumn(header.getDraggedColumn())) { TableColumn draggedColumn = header.getDraggedColumn();
if (draggedColumn != null &&
column == SwingUtilities2.convertColumnIndexToView(
header.getColumnModel(), draggedColumn.getModelIndex())) {
state = State.PRESSED; state = State.PRESSED;
} else if (isSelected || hasFocus || hasRollover) { } else if (isSelected || hasFocus || hasRollover) {
state = State.HOT; state = State.HOT;
......
...@@ -222,6 +222,25 @@ public class DefaultPersistenceDelegate extends PersistenceDelegate { ...@@ -222,6 +222,25 @@ public class DefaultPersistenceDelegate extends PersistenceDelegate {
// Write out the properties of this instance. // Write out the properties of this instance.
private void initBean(Class type, Object oldInstance, Object newInstance, Encoder out) { private void initBean(Class type, Object oldInstance, Object newInstance, Encoder out) {
for (Field field : type.getFields()) {
int mod = field.getModifiers();
if (Modifier.isFinal(mod) || Modifier.isStatic(mod) || Modifier.isTransient(mod)) {
continue;
}
try {
Expression oldGetExp = new Expression(field, "get", new Object[] { oldInstance });
Expression newGetExp = new Expression(field, "get", new Object[] { newInstance });
Object oldValue = oldGetExp.getValue();
Object newValue = newGetExp.getValue();
out.writeExpression(oldGetExp);
if (!equals(newValue, out.get(oldValue))) {
out.writeStatement(new Statement(field, "set", new Object[] { oldInstance, oldValue }));
}
}
catch (Exception exception) {
out.getExceptionListener().exceptionThrown(exception);
}
}
BeanInfo info; BeanInfo info;
try { try {
info = Introspector.getBeanInfo(type); info = Introspector.getBeanInfo(type);
......
...@@ -700,56 +700,6 @@ class java_beans_beancontext_BeanContextSupport_PersistenceDelegate extends java ...@@ -700,56 +700,6 @@ class java_beans_beancontext_BeanContextSupport_PersistenceDelegate extends java
// AWT // AWT
/**
* The persistence delegate for {@link Dimension}.
* It is impossible to use {@link DefaultPersistenceDelegate}
* because all getters have return types that differ from parameter types
* of the constructor {@link Dimension#Dimension(int, int)}.
*
* @author Sergey A. Malenkov
*/
final class java_awt_Dimension_PersistenceDelegate extends PersistenceDelegate {
protected boolean mutatesTo(Object oldInstance, Object newInstance) {
return oldInstance.equals(newInstance);
}
protected Expression instantiate(Object oldInstance, Encoder out) {
Dimension dimension = (Dimension) oldInstance;
Object[] args = new Object[] {
dimension.width,
dimension.height,
};
return new Expression(dimension, dimension.getClass(), "new", args);
}
}
/**
* The persistence delegate for {@link GridBagConstraints}.
* It is impossible to use {@link DefaultPersistenceDelegate}
* because this class does not have any properties.
*
* @author Sergey A. Malenkov
*/
final class java_awt_GridBagConstraints_PersistenceDelegate extends PersistenceDelegate {
protected Expression instantiate(Object oldInstance, Encoder out) {
GridBagConstraints gbc = (GridBagConstraints) oldInstance;
Object[] args = new Object[] {
gbc.gridx,
gbc.gridy,
gbc.gridwidth,
gbc.gridheight,
gbc.weightx,
gbc.weighty,
gbc.anchor,
gbc.fill,
gbc.insets,
gbc.ipadx,
gbc.ipady,
};
return new Expression(gbc, gbc.getClass(), "new", args);
}
}
/** /**
* The persistence delegate for {@link Insets}. * The persistence delegate for {@link Insets}.
* It is impossible to use {@link DefaultPersistenceDelegate} * It is impossible to use {@link DefaultPersistenceDelegate}
...@@ -774,54 +724,6 @@ final class java_awt_Insets_PersistenceDelegate extends PersistenceDelegate { ...@@ -774,54 +724,6 @@ final class java_awt_Insets_PersistenceDelegate extends PersistenceDelegate {
} }
} }
/**
* The persistence delegate for {@link Point}.
* It is impossible to use {@link DefaultPersistenceDelegate}
* because all getters have return types that differ from parameter types
* of the constructor {@link Point#Point(int, int)}.
*
* @author Sergey A. Malenkov
*/
final class java_awt_Point_PersistenceDelegate extends PersistenceDelegate {
protected boolean mutatesTo(Object oldInstance, Object newInstance) {
return oldInstance.equals(newInstance);
}
protected Expression instantiate(Object oldInstance, Encoder out) {
Point point = (Point) oldInstance;
Object[] args = new Object[] {
point.x,
point.y,
};
return new Expression(point, point.getClass(), "new", args);
}
}
/**
* The persistence delegate for {@link Rectangle}.
* It is impossible to use {@link DefaultPersistenceDelegate}
* because all getters have return types that differ from parameter types
* of the constructor {@link Rectangle#Rectangle(int, int, int, int)}.
*
* @author Sergey A. Malenkov
*/
final class java_awt_Rectangle_PersistenceDelegate extends PersistenceDelegate {
protected boolean mutatesTo(Object oldInstance, Object newInstance) {
return oldInstance.equals(newInstance);
}
protected Expression instantiate(Object oldInstance, Encoder out) {
Rectangle rectangle = (Rectangle) oldInstance;
Object[] args = new Object[] {
rectangle.x,
rectangle.y,
rectangle.width,
rectangle.height,
};
return new Expression(rectangle, rectangle.getClass(), "new", args);
}
}
/** /**
* The persistence delegate for {@link Font}. * The persistence delegate for {@link Font}.
* It is impossible to use {@link DefaultPersistenceDelegate} * It is impossible to use {@link DefaultPersistenceDelegate}
......
...@@ -407,7 +407,20 @@ public class XMLEncoder extends Encoder { ...@@ -407,7 +407,20 @@ public class XMLEncoder extends Encoder {
os.writeObject(this); os.writeObject(this);
*/ */
mark(oldStm); mark(oldStm);
statementList(oldStm.getTarget()).add(oldStm); Object target = oldStm.getTarget();
if (target instanceof Field) {
String method = oldStm.getMethodName();
Object[] args = oldStm.getArguments();
if ((method == null) || (args == null)) {
}
else if (method.equals("get") && (args.length == 1)) {
target = args[0];
}
else if (method.equals("set") && (args.length == 2)) {
target = args[0];
}
}
statementList(target).add(oldStm);
} }
catch (Exception e) { catch (Exception e) {
getExceptionListener().exceptionThrown(new Exception("XMLEncoder: discarding statement " + oldStm, e)); getExceptionListener().exceptionThrown(new Exception("XMLEncoder: discarding statement " + oldStm, e));
...@@ -703,7 +716,9 @@ public class XMLEncoder extends Encoder { ...@@ -703,7 +716,9 @@ public class XMLEncoder extends Encoder {
statements.add(exp); statements.add(exp);
} }
outputValue(target, outer, false); outputValue(target, outer, false);
outputValue(value, outer, isArgument); if (expression) {
outputValue(value, outer, isArgument);
}
return; return;
} }
if (expression && (d.refs > 1)) { if (expression && (d.refs > 1)) {
...@@ -722,8 +737,10 @@ public class XMLEncoder extends Encoder { ...@@ -722,8 +737,10 @@ public class XMLEncoder extends Encoder {
} }
else if ((!expression && methodName.startsWith("set") && args.length == 1) || else if ((!expression && methodName.startsWith("set") && args.length == 1) ||
(expression && methodName.startsWith("get") && args.length == 0)) { (expression && methodName.startsWith("get") && args.length == 0)) {
attributes = attributes + " property=" + if (3 < methodName.length()) {
quote(Introspector.decapitalize(methodName.substring(3))); attributes = attributes + " property=" +
quote(Introspector.decapitalize(methodName.substring(3)));
}
} }
else if (!methodName.equals("new") && !methodName.equals("newInstance")) { else if (!methodName.equals("new") && !methodName.equals("newInstance")) {
attributes = attributes + " method=" + quote(methodName); attributes = attributes + " method=" + quote(methodName);
......
...@@ -26,17 +26,13 @@ ...@@ -26,17 +26,13 @@
package javax.swing; package javax.swing;
import java.awt.*; import com.sun.awt.AWTUtilities;
import java.beans.PropertyVetoException;
import java.beans.PropertyChangeEvent;
import javax.swing.border.Border;
import java.awt.event.ComponentListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import sun.awt.AWTAccessor; import sun.awt.AWTAccessor;
import sun.awt.SunToolkit; import sun.awt.SunToolkit;
import java.awt.*;
import java.beans.PropertyVetoException;
/** This is an implementation of the <code>DesktopManager</code>. /** This is an implementation of the <code>DesktopManager</code>.
* It currently implements the basic behaviors for managing * It currently implements the basic behaviors for managing
* <code>JInternalFrame</code>s in an arbitrary parent. * <code>JInternalFrame</code>s in an arbitrary parent.
...@@ -318,7 +314,10 @@ public class DefaultDesktopManager implements DesktopManager, java.io.Serializab ...@@ -318,7 +314,10 @@ public class DefaultDesktopManager implements DesktopManager, java.io.Serializab
dragMode = DEFAULT_DRAG_MODE; dragMode = DEFAULT_DRAG_MODE;
if (p != null) { if (p != null) {
String mode = (String)p.getClientProperty("JDesktopPane.dragMode"); String mode = (String)p.getClientProperty("JDesktopPane.dragMode");
if (mode != null && mode.equals("outline")) { Window window = SwingUtilities.getWindowAncestor(f);
if (window != null && !AWTUtilities.isWindowOpaque(window)) {
dragMode = DEFAULT_DRAG_MODE;
} else if (mode != null && mode.equals("outline")) {
dragMode = OUTLINE_DRAG_MODE; dragMode = OUTLINE_DRAG_MODE;
} else if (mode != null && mode.equals("faster") } else if (mode != null && mode.equals("faster")
&& f instanceof JInternalFrame && f instanceof JInternalFrame
......
...@@ -2583,10 +2583,8 @@ public class JTable extends JComponent implements TableModelListener, Scrollable ...@@ -2583,10 +2583,8 @@ public class JTable extends JComponent implements TableModelListener, Scrollable
* @see #convertColumnIndexToView * @see #convertColumnIndexToView
*/ */
public int convertColumnIndexToModel(int viewColumnIndex) { public int convertColumnIndexToModel(int viewColumnIndex) {
if (viewColumnIndex < 0) { return SwingUtilities2.convertColumnIndexToModel(
return viewColumnIndex; getColumnModel(), viewColumnIndex);
}
return getColumnModel().getColumn(viewColumnIndex).getModelIndex();
} }
/** /**
...@@ -2603,16 +2601,8 @@ public class JTable extends JComponent implements TableModelListener, Scrollable ...@@ -2603,16 +2601,8 @@ public class JTable extends JComponent implements TableModelListener, Scrollable
* @see #convertColumnIndexToModel * @see #convertColumnIndexToModel
*/ */
public int convertColumnIndexToView(int modelColumnIndex) { public int convertColumnIndexToView(int modelColumnIndex) {
if (modelColumnIndex < 0) { return SwingUtilities2.convertColumnIndexToView(
return modelColumnIndex; getColumnModel(), modelColumnIndex);
}
TableColumnModel cm = getColumnModel();
for (int column = 0; column < getColumnCount(); column++) {
if (cm.getColumn(column).getModelIndex() == modelColumnIndex) {
return column;
}
}
return -1;
} }
/** /**
......
/* /*
* Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -26,7 +26,6 @@ package javax.swing.border; ...@@ -26,7 +26,6 @@ package javax.swing.border;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.Insets; import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Component; import java.awt.Component;
import java.awt.Color; import java.awt.Color;
...@@ -133,63 +132,29 @@ public class MatteBorder extends EmptyBorder ...@@ -133,63 +132,29 @@ public class MatteBorder extends EmptyBorder
g.fillRect(width - insets.right, 0, insets.right, height - insets.bottom); g.fillRect(width - insets.right, 0, insets.right, height - insets.bottom);
} else if (tileIcon != null) { } else if (tileIcon != null) {
int tileW = tileIcon.getIconWidth(); int tileW = tileIcon.getIconWidth();
int tileH = tileIcon.getIconHeight(); int tileH = tileIcon.getIconHeight();
int xpos, ypos, startx, starty; paintEdge(c, g, 0, 0, width - insets.right, insets.top, tileW, tileH);
Graphics cg; paintEdge(c, g, 0, insets.top, insets.left, height - insets.top, tileW, tileH);
paintEdge(c, g, insets.left, height - insets.bottom, width - insets.left, insets.bottom, tileW, tileH);
// Paint top matte edge paintEdge(c, g, width - insets.right, 0, insets.right, height - insets.bottom, tileW, tileH);
cg = g.create();
cg.setClip(0, 0, width, insets.top);
for (ypos = 0; insets.top - ypos > 0; ypos += tileH) {
for (xpos = 0; width - xpos > 0; xpos += tileW) {
tileIcon.paintIcon(c, cg, xpos, ypos);
}
}
cg.dispose();
// Paint left matte edge
cg = g.create();
cg.setClip(0, insets.top, insets.left, height - insets.top);
starty = insets.top - (insets.top%tileH);
startx = 0;
for (ypos = starty; height - ypos > 0; ypos += tileH) {
for (xpos = startx; insets.left - xpos > 0; xpos += tileW) {
tileIcon.paintIcon(c, cg, xpos, ypos);
}
}
cg.dispose();
// Paint bottom matte edge
cg = g.create();
cg.setClip(insets.left, height - insets.bottom, width - insets.left, insets.bottom);
starty = (height - insets.bottom) - ((height - insets.bottom)%tileH);
startx = insets.left - (insets.left%tileW);
for (ypos = starty; height - ypos > 0; ypos += tileH) {
for (xpos = startx; width - xpos > 0; xpos += tileW) {
tileIcon.paintIcon(c, cg, xpos, ypos);
}
}
cg.dispose();
// Paint right matte edge
cg = g.create();
cg.setClip(width - insets.right, insets.top, insets.right, height - insets.top - insets.bottom);
starty = insets.top - (insets.top%tileH);
startx = width - insets.right - ((width - insets.right)%tileW);
for (ypos = starty; height - ypos > 0; ypos += tileH) {
for (xpos = startx; width - xpos > 0; xpos += tileW) {
tileIcon.paintIcon(c, cg, xpos, ypos);
}
}
cg.dispose();
} }
g.translate(-x, -y); g.translate(-x, -y);
g.setColor(oldColor); g.setColor(oldColor);
} }
private void paintEdge(Component c, Graphics g, int x, int y, int width, int height, int tileW, int tileH) {
g = g.create(x, y, width, height);
int sY = -(y % tileH);
for (x = -(x % tileW); x < width; x += tileW) {
for (y = sY; y < height; y += tileH) {
this.tileIcon.paintIcon(c, g, x, y);
}
}
g.dispose();
}
/** /**
* Reinitialize the insets parameter with this Border's current Insets. * Reinitialize the insets parameter with this Border's current Insets.
* @param c the component for which this border insets value applies * @param c the component for which this border insets value applies
......
...@@ -3524,7 +3524,11 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants { ...@@ -3524,7 +3524,11 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants {
} }
else if (name =="indexForTitle") { else if (name =="indexForTitle") {
calculatedBaseline = false; calculatedBaseline = false;
updateHtmlViews((Integer)e.getNewValue()); Integer index = (Integer) e.getNewValue();
// remove the current index
// to let updateHtmlViews() insert the correct one
htmlViews.removeElementAt(index);
updateHtmlViews(index);
} else if (name == "tabLayoutPolicy") { } else if (name == "tabLayoutPolicy") {
BasicTabbedPaneUI.this.uninstallUI(pane); BasicTabbedPaneUI.this.uninstallUI(pane);
BasicTabbedPaneUI.this.installUI(pane); BasicTabbedPaneUI.this.installUI(pane);
......
...@@ -98,15 +98,18 @@ public class BasicTableHeaderUI extends TableHeaderUI { ...@@ -98,15 +98,18 @@ public class BasicTableHeaderUI extends TableHeaderUI {
private Cursor otherCursor = resizeCursor; private Cursor otherCursor = resizeCursor;
public void mouseClicked(MouseEvent e) { public void mouseClicked(MouseEvent e) {
if (!header.isEnabled()) {
return;
}
if (e.getClickCount() % 2 == 1 && if (e.getClickCount() % 2 == 1 &&
SwingUtilities.isLeftMouseButton(e)){ SwingUtilities.isLeftMouseButton(e)) {
JTable table = header.getTable(); JTable table = header.getTable();
RowSorter sorter; RowSorter sorter;
if (table != null && (sorter = table.getRowSorter()) != null) { if (table != null && (sorter = table.getRowSorter()) != null) {
int columnIndex = header.columnAtPoint(e.getPoint()); int columnIndex = header.columnAtPoint(e.getPoint());
if (columnIndex != -1) { if (columnIndex != -1) {
columnIndex = table.convertColumnIndexToModel( columnIndex = table.convertColumnIndexToModel(
columnIndex); columnIndex);
sorter.toggleSortOrder(columnIndex); sorter.toggleSortOrder(columnIndex);
} }
} }
...@@ -140,6 +143,9 @@ public class BasicTableHeaderUI extends TableHeaderUI { ...@@ -140,6 +143,9 @@ public class BasicTableHeaderUI extends TableHeaderUI {
} }
public void mousePressed(MouseEvent e) { public void mousePressed(MouseEvent e) {
if (!header.isEnabled()) {
return;
}
header.setDraggedColumn(null); header.setDraggedColumn(null);
header.setResizingColumn(null); header.setResizingColumn(null);
header.setDraggedDistance(0); header.setDraggedDistance(0);
...@@ -182,6 +188,9 @@ public class BasicTableHeaderUI extends TableHeaderUI { ...@@ -182,6 +188,9 @@ public class BasicTableHeaderUI extends TableHeaderUI {
} }
public void mouseMoved(MouseEvent e) { public void mouseMoved(MouseEvent e) {
if (!header.isEnabled()) {
return;
}
if (canResize(getResizingColumn(e.getPoint()), header) != if (canResize(getResizingColumn(e.getPoint()), header) !=
(header.getCursor() == resizeCursor)) { (header.getCursor() == resizeCursor)) {
swapCursor(); swapCursor();
...@@ -190,6 +199,9 @@ public class BasicTableHeaderUI extends TableHeaderUI { ...@@ -190,6 +199,9 @@ public class BasicTableHeaderUI extends TableHeaderUI {
} }
public void mouseDragged(MouseEvent e) { public void mouseDragged(MouseEvent e) {
if (!header.isEnabled()) {
return;
}
int mouseX = e.getX(); int mouseX = e.getX();
TableColumn resizingColumn = header.getResizingColumn(); TableColumn resizingColumn = header.getResizingColumn();
...@@ -217,21 +229,23 @@ public class BasicTableHeaderUI extends TableHeaderUI { ...@@ -217,21 +229,23 @@ public class BasicTableHeaderUI extends TableHeaderUI {
if (0 <= newColumnIndex && newColumnIndex < cm.getColumnCount()) { if (0 <= newColumnIndex && newColumnIndex < cm.getColumnCount()) {
int width = cm.getColumn(newColumnIndex).getWidth(); int width = cm.getColumn(newColumnIndex).getWidth();
if (Math.abs(draggedDistance) > (width / 2)) { if (Math.abs(draggedDistance) > (width / 2)) {
JTable table = header.getTable();
mouseXOffset = mouseXOffset + direction * width; mouseXOffset = mouseXOffset + direction * width;
header.setDraggedDistance(draggedDistance - direction * width); header.setDraggedDistance(draggedDistance - direction * width);
//Cache the selected column. //Cache the selected column.
int selectedIndex = table.convertColumnIndexToModel( int selectedIndex =
getSelectedColumnIndex()); SwingUtilities2.convertColumnIndexToModel(
header.getColumnModel(),
getSelectedColumnIndex());
//Now do the move. //Now do the move.
cm.moveColumn(columnIndex, newColumnIndex); cm.moveColumn(columnIndex, newColumnIndex);
//Update the selected index. //Update the selected index.
selectColumn( selectColumn(
table.convertColumnIndexToView(selectedIndex), SwingUtilities2.convertColumnIndexToView(
header.getColumnModel(), selectedIndex),
false); false);
return; return;
...@@ -244,6 +258,9 @@ public class BasicTableHeaderUI extends TableHeaderUI { ...@@ -244,6 +258,9 @@ public class BasicTableHeaderUI extends TableHeaderUI {
} }
public void mouseReleased(MouseEvent e) { public void mouseReleased(MouseEvent e) {
if (!header.isEnabled()) {
return;
}
setDraggedDistance(0, viewIndexForColumn(header.getDraggedColumn())); setDraggedDistance(0, viewIndexForColumn(header.getDraggedColumn()));
header.setResizingColumn(null); header.setResizingColumn(null);
...@@ -253,10 +270,16 @@ public class BasicTableHeaderUI extends TableHeaderUI { ...@@ -253,10 +270,16 @@ public class BasicTableHeaderUI extends TableHeaderUI {
} }
public void mouseEntered(MouseEvent e) { public void mouseEntered(MouseEvent e) {
if (!header.isEnabled()) {
return;
}
updateRolloverColumn(e); updateRolloverColumn(e);
} }
public void mouseExited(MouseEvent e) { public void mouseExited(MouseEvent e) {
if (!header.isEnabled()) {
return;
}
int oldRolloverColumn = rolloverColumn; int oldRolloverColumn = rolloverColumn;
rolloverColumn = -1; rolloverColumn = -1;
rolloverColumnUpdated(oldRolloverColumn, rolloverColumn); rolloverColumnUpdated(oldRolloverColumn, rolloverColumn);
......
...@@ -779,20 +779,16 @@ public abstract class BasicTextUI extends TextUI implements ViewFactory { ...@@ -779,20 +779,16 @@ public abstract class BasicTextUI extends TextUI implements ViewFactory {
if (c instanceof JTextComponent) { if (c instanceof JTextComponent) {
editor = (JTextComponent) c; editor = (JTextComponent) c;
// common case is background painted... this can
// easily be changed by subclasses or from outside
// of the component.
LookAndFeel.installProperty(editor, "opaque", Boolean.TRUE);
LookAndFeel.installProperty(editor, "autoscrolls", Boolean.TRUE);
// install defaults // install defaults
installDefaults(); installDefaults();
installDefaults2(); installDefaults2();
// This is a workaround as these should not override what synth has
// set them to
if (! (this instanceof SynthUI)) {
// common case is background painted... this can
// easily be changed by subclasses or from outside
// of the component.
LookAndFeel.installProperty(editor, "opaque", Boolean.TRUE);
LookAndFeel.installProperty(editor, "autoscrolls", Boolean.TRUE);
}
// attach to the model and editor // attach to the model and editor
editor.addPropertyChangeListener(updateHandler); editor.addPropertyChangeListener(updateHandler);
Document doc = editor.getDocument(); Document doc = editor.getDocument();
......
...@@ -56,8 +56,8 @@ public class BasicViewportUI extends ViewportUI { ...@@ -56,8 +56,8 @@ public class BasicViewportUI extends ViewportUI {
} }
public void uninstallUI(JComponent c) { public void uninstallUI(JComponent c) {
uninstallDefaults(c);
super.uninstallUI(c); super.uninstallUI(c);
} }
protected void installDefaults(JComponent c) { protected void installDefaults(JComponent c) {
......
...@@ -361,12 +361,14 @@ public class SynthTableUI extends BasicTableUI ...@@ -361,12 +361,14 @@ public class SynthTableUI extends BasicTableUI
cMax = table.getColumnCount()-1; cMax = table.getColumnCount()-1;
} }
// Paint the grid.
paintGrid(context, g, rMin, rMax, cMin, cMax);
// Paint the cells. // Paint the cells.
paintCells(context, g, rMin, rMax, cMin, cMax); paintCells(context, g, rMin, rMax, cMin, cMax);
// Paint the grid.
// it is important to paint the grid after the cells, otherwise the grid will be overpainted
// because in Synth cell renderers are likely to be opaque
paintGrid(context, g, rMin, rMax, cMin, cMax);
paintDropLines(context, g); paintDropLines(context, g);
} }
......
...@@ -72,7 +72,28 @@ public class SynthTextPaneUI extends SynthEditorPaneUI { ...@@ -72,7 +72,28 @@ public class SynthTextPaneUI extends SynthEditorPaneUI {
} }
/** /**
* @inheritDoc * Installs the UI for a component. This does the following
* things.
* <ol>
* <li>
* Sets opaqueness of the associated component according to its style,
* if the opaque property has not already been set by the client program.
* <li>
* Installs the default caret and highlighter into the
* associated component. These properties are only set if their
* current value is either {@code null} or an instance of
* {@link UIResource}.
* <li>
* Attaches to the editor and model. If there is no
* model, a default one is created.
* <li>
* Creates the view factory and the view hierarchy used
* to represent the model.
* </ol>
*
* @param c the editor component
* @see BasicTextUI#installUI
* @see ComponentUI#installUI
*/ */
@Override @Override
public void installUI(JComponent c) { public void installUI(JComponent c) {
......
...@@ -24,8 +24,6 @@ ...@@ -24,8 +24,6 @@
*/ */
package javax.swing.text; package javax.swing.text;
import java.util.Vector;
import java.util.Properties;
import java.awt.*; import java.awt.*;
import java.lang.ref.SoftReference; import java.lang.ref.SoftReference;
import javax.swing.event.*; import javax.swing.event.*;
...@@ -236,9 +234,6 @@ public class WrappedPlainView extends BoxView implements TabExpander { ...@@ -236,9 +234,6 @@ public class WrappedPlainView extends BoxView implements TabExpander {
Segment segment = SegmentCache.getSharedSegment(); Segment segment = SegmentCache.getSharedSegment();
loadText(segment, p0, p1); loadText(segment, p0, p1);
int currentWidth = getWidth(); int currentWidth = getWidth();
if (currentWidth == Integer.MAX_VALUE) {
currentWidth = (int) getDefaultSpan(View.X_AXIS);
}
if (wordWrap) { if (wordWrap) {
p = p0 + Utilities.getBreakLocation(segment, metrics, p = p0 + Utilities.getBreakLocation(segment, metrics,
tabBase, tabBase + currentWidth, tabBase, tabBase + currentWidth,
...@@ -324,53 +319,6 @@ public class WrappedPlainView extends BoxView implements TabExpander { ...@@ -324,53 +319,6 @@ public class WrappedPlainView extends BoxView implements TabExpander {
tabSize = getTabSize() * metrics.charWidth('m'); tabSize = getTabSize() * metrics.charWidth('m');
} }
/**
* Return reasonable default values for the view dimensions. The standard
* text terminal size 80x24 is pretty suitable for the wrapped plain view.
*
* The size should not be larger than the component housing the view's
* container.
*/
private float getDefaultSpan(int axis) {
Container host = getContainer();
Component parent = null;
if (host != null) {
parent = host.getParent();
}
switch (axis) {
case View.X_AXIS:
int defaultWidth = 80 * metrics.getWidths()['M'];
int parentWidth = 0;
if (parent != null) {
parentWidth = parent.getWidth();
}
if (defaultWidth > parentWidth) {
return parentWidth;
}
return defaultWidth;
case View.Y_AXIS:
int defaultHeight = 24 * metrics.getHeight();
int parentHeight = 0;
if (parent != null) {
parentHeight = parent.getHeight();
}
if (defaultHeight > parentHeight) {
return parentHeight;
}
return defaultHeight;
default:
throw new IllegalArgumentException("Invalid axis: " + axis);
}
}
// --- TabExpander methods ------------------------------------------ // --- TabExpander methods ------------------------------------------
/** /**
...@@ -605,18 +553,14 @@ public class WrappedPlainView extends BoxView implements TabExpander { ...@@ -605,18 +553,14 @@ public class WrappedPlainView extends BoxView implements TabExpander {
if (width == Integer.MAX_VALUE) { if (width == Integer.MAX_VALUE) {
// We have been initially set to MAX_VALUE, but we don't // We have been initially set to MAX_VALUE, but we don't
// want this as our preferred. // want this as our preferred.
width = getDefaultSpan(axis); return 100f;
} }
return width; return width;
case View.Y_AXIS: case View.Y_AXIS:
if (getDocument().getLength() > 0) { if (lineCount < 0 || widthChanging) {
if ((lineCount < 0) || widthChanging) { breakLines(getStartOffset());
breakLines(getStartOffset());
}
return lineCount * metrics.getHeight();
} else {
return getDefaultSpan(axis);
} }
return lineCount * metrics.getHeight();
default: default:
throw new IllegalArgumentException("Invalid axis: " + axis); throw new IllegalArgumentException("Invalid axis: " + axis);
} }
......
...@@ -44,6 +44,8 @@ import javax.swing.text.JTextComponent; ...@@ -44,6 +44,8 @@ import javax.swing.text.JTextComponent;
import javax.swing.text.DefaultHighlighter; import javax.swing.text.DefaultHighlighter;
import javax.swing.text.DefaultCaret; import javax.swing.text.DefaultCaret;
import javax.swing.table.TableCellRenderer; import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
import sun.swing.PrintColorUIResource; import sun.swing.PrintColorUIResource;
import sun.swing.ImageIconUIResource; import sun.swing.ImageIconUIResource;
import sun.print.ProxyPrintGraphics; import sun.print.ProxyPrintGraphics;
...@@ -1807,4 +1809,54 @@ public class SwingUtilities2 { ...@@ -1807,4 +1809,54 @@ public class SwingUtilities2 {
boolean three) { boolean three) {
return liesIn(rect, p, false, false, three); return liesIn(rect, p, false, false, three);
} }
/**
* Maps the index of the column in the view at
* {@code viewColumnIndex} to the index of the column
* in the table model. Returns the index of the corresponding
* column in the model. If {@code viewColumnIndex}
* is less than zero, returns {@code viewColumnIndex}.
*
* @param cm the table model
* @param viewColumnIndex the index of the column in the view
* @return the index of the corresponding column in the model
*
* @see JTable#convertColumnIndexToModel(int)
* @see javax.swing.plaf.basic.BasicTableHeaderUI
*/
public static int convertColumnIndexToModel(TableColumnModel cm,
int viewColumnIndex) {
if (viewColumnIndex < 0) {
return viewColumnIndex;
}
return cm.getColumn(viewColumnIndex).getModelIndex();
}
/**
* Maps the index of the column in the {@code cm} at
* {@code modelColumnIndex} to the index of the column
* in the view. Returns the index of the
* corresponding column in the view; returns {@code -1} if this column
* is not being displayed. If {@code modelColumnIndex} is less than zero,
* returns {@code modelColumnIndex}.
*
* @param cm the table model
* @param modelColumnIndex the index of the column in the model
* @return the index of the corresponding column in the view
*
* @see JTable#convertColumnIndexToView(int)
* @see javax.swing.plaf.basic.BasicTableHeaderUI
*/
public static int convertColumnIndexToView(TableColumnModel cm,
int modelColumnIndex) {
if (modelColumnIndex < 0) {
return modelColumnIndex;
}
for (int column = 0; column < cm.getColumnCount(); column++) {
if (cm.getColumn(column).getModelIndex() == modelColumnIndex) {
return column;
}
}
return -1;
}
} }
...@@ -788,7 +788,7 @@ public class SynthFileChooserUIImpl extends SynthFileChooserUI { ...@@ -788,7 +788,7 @@ public class SynthFileChooserUIImpl extends SynthFileChooserUI {
// for example /foo/bar/ becomes /foo/bar // for example /foo/bar/ becomes /foo/bar
File canonical; File canonical;
try { try {
canonical = directory.getCanonicalFile(); canonical = ShellFolder.getNormalizedFile(directory);
} catch (IOException e) { } catch (IOException e) {
// Maybe drive is not ready. Can't abort here. // Maybe drive is not ready. Can't abort here.
canonical = directory; canonical = directory;
......
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
*/ */
package sun.swing.table; package sun.swing.table;
import sun.swing.DefaultLookup;
import java.awt.Component; import java.awt.Component;
import java.awt.Color; import java.awt.Color;
import java.awt.FontMetrics; import java.awt.FontMetrics;
...@@ -31,12 +33,11 @@ import java.awt.Graphics; ...@@ -31,12 +33,11 @@ import java.awt.Graphics;
import java.awt.Insets; import java.awt.Insets;
import java.awt.Point; import java.awt.Point;
import java.awt.Rectangle; import java.awt.Rectangle;
import java.io.Serializable;
import javax.swing.*; import javax.swing.*;
import javax.swing.plaf.UIResource; import javax.swing.plaf.UIResource;
import javax.swing.border.Border; import javax.swing.border.Border;
import javax.swing.table.*; import javax.swing.table.*;
import sun.swing.DefaultLookup;
public class DefaultTableCellHeaderRenderer extends DefaultTableCellRenderer public class DefaultTableCellHeaderRenderer extends DefaultTableCellRenderer
implements UIResource { implements UIResource {
...@@ -186,7 +187,7 @@ public class DefaultTableCellHeaderRenderer extends DefaultTableCellRenderer ...@@ -186,7 +187,7 @@ public class DefaultTableCellHeaderRenderer extends DefaultTableCellRenderer
return new Point(x, y); return new Point(x, y);
} }
private class EmptyIcon implements Icon { private class EmptyIcon implements Icon, Serializable {
int width = 0; int width = 0;
int height = 0; int height = 0;
public void paintIcon(Component c, Graphics g, int x, int y) {} public void paintIcon(Component c, Graphics g, int x, int y) {}
......
...@@ -55,7 +55,6 @@ public final class java_awt_GridBagConstraints extends AbstractTest<GridBagConst ...@@ -55,7 +55,6 @@ public final class java_awt_GridBagConstraints extends AbstractTest<GridBagConst
} }
protected GridBagConstraints getAnotherObject() { protected GridBagConstraints getAnotherObject() {
return null; // TODO: could not update property return new GridBagConstraints();
// return new GridBagConstraints();
} }
} }
/*
* Copyright 2010 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
/*@test
@bug 6670274
@summary Incorrect tab titles for JTabbedPane if using HTML (BasicTabbedPanelUI problem)
@author Alexander Potochkin
@run main bug6670274
*/
import javax.swing.*;
import javax.swing.plaf.basic.BasicTabbedPaneUI;
import javax.swing.text.View;
public class bug6670274 {
private static void createGui() {
final JTabbedPane pane = new JTabbedPane();
TestTabbedPaneUI ui = new TestTabbedPaneUI();
pane.setUI(ui);
pane.add("one", new JPanel());
pane.add("<html><i>Two</i></html>", new JPanel());
pane.add("three", new JPanel());
pane.setTitleAt(0, "<html><i>ONE</i></html>");
check(ui, 0, 1);
pane.setTitleAt(1, "hello");
check(ui, 0);
pane.setTitleAt(0, "<html>html</html>");
pane.setTitleAt(2, "<html>html</html>");
check(ui, 0, 2);
}
private static void check(TestTabbedPaneUI ui, int... indices) {
for(int i = 0; i < ui.getTabbedPane().getTabCount(); i++) {
System.out.print("Checking tab #" + i);
View view = ui.getTextViewForTab(i);
boolean found = false;
for (int j = 0; j < indices.length; j++) {
if (indices[j]== i) {
found = true;
break;
}
}
System.out.print("; view = " + view);
if (found) {
if (view == null) {
throw new RuntimeException("View is unexpectedly null");
}
} else if (view != null) {
throw new RuntimeException("View is unexpectedly not null");
}
System.out.println(" ok");
}
System.out.println("");
}
static class TestTabbedPaneUI extends BasicTabbedPaneUI {
public View getTextViewForTab(int tabIndex) {
return super.getTextViewForTab(tabIndex);
}
public JTabbedPane getTabbedPane() {
return tabPane;
}
}
public static void main(String[] args) throws Exception {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
bug6670274.createGui();
}
});
}
}
/*
* Copyright 2010 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
/* @test
@bug 6768387
@summary REGRESSION: JTable no longer serializable
@author Alexander Potochkin
@run main bug6768387
*/
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.io.*;
public class bug6768387 {
private static void createGui() {
JTable table = new JTable();
OutputStream os;
ObjectOutputStream out;
try {
os = new ByteArrayOutputStream();
out = new ObjectOutputStream(os);
out.writeObject(table);
out.close();
}
catch (Exception ex) {
throw new RuntimeException(ex);
}
}
public static void main(String[] args) throws Exception {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
bug6768387.createGui();
}
});
}
}
/*
* Copyright 2010 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
/* @test
@bug 6937798
@summary Nimbus: Issues with JTable grid
@author Alexander Potochkin
@run main bug6937798
*/
import com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
import java.awt.*;
import java.awt.image.BufferedImage;
public class bug6937798 {
public static void main(String... args) throws Exception {
UIManager.setLookAndFeel(new NimbusLookAndFeel());
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
new bug6937798();
}
});
}
public bug6937798() {
final JTable table = createCountryTable();
table.setShowGrid(true);
table.setSize(100, 100);
BufferedImage im = new BufferedImage(table.getWidth(), table.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics g = im.getGraphics();
table.print(g);
g.dispose();
for (int i = 0; i < im.getHeight(); i++) {
for (int j = 0; j < im.getWidth(); j++) {
if (im.getRGB(i, j) == table.getGridColor().getRGB()) {
System.out.println("got it!");
return;
}
}
}
throw new RuntimeException("no table's grid detected....");
}
protected JTable createCountryTable() {
// Column headers
final String
[] headers = {
"Name", "Capital City", "Language(s)", "Monetary Unit(s)", "EC Member"
};
// Table data
final Object[][] data = {
{"Albania", "Tirane", "Albanian, Greek", "Lek", new Boolean(false)},
{"Andorra", "Andorra la Vella", "Catalan, French, Spanish", "French Franc, Spanish Peseta", new Boolean(false)},
{"Austria", "Vienna", "German, Slovenian, Croatian", "Schilling", new Boolean(false)},
{"Belarus", "Minsk", "Byelorussian, Russian", "Belarusian Rubel", new Boolean(false)},
{"Belgium", "Brussels", "French, Flemish, German", "Belgian Franc", new Boolean(true)},
{"Bosnia & Herzegovina", "Sarajevo", "Serbo-Croatian", "Dinar", new Boolean(false)},
{"Bulgaria", "Sofia", "Bulgarian, Turkish", "Lev", new Boolean(false)},
{"Croatia", "Zagreb", "Serbo-Croatian", "Croatian Kuna", new Boolean(false)},
{"Czech Republic", "Prague", "Czech, Slovak", "Koruna", new Boolean(false)},
{"Denmark", "Copenhagen", "Danish", "Krone", new Boolean(true)},
{"Estonia", "Tallinn", "Estonian, Latvian, Lithuanian, Russian", "Estonian Kroon", new Boolean(false)},
{"Finland", "Helsinki", "Finnish, Swedish, Lappish", "Markka", new Boolean(false)},
{"France", "Paris", "French", "Franc", new Boolean(true)},
{"Germany", "Berlin", "German", "Deutsche Mark", new Boolean(true)},
{"Greece", "Athens", "Greek, English, French", "Drachma", new Boolean(true)},
{"Hungary", "Budapest", "Hungarian", "Forint", new Boolean(false)},
{"Iceland", "Reykjavik", "Icelandic", "Icelandic Krona", new Boolean(false)},
{"Ireland", "Dublin", "Irish, English", "Pound", new Boolean(true)},
{"Italy", "Rome", "Italian", "Lira", new Boolean(true)},
{"Latvia", "Riga", "Lettish, Lithuanian, Russian", "Lat", new Boolean(false)},
{"Liechtenstein", "Vaduz", "German", "Swiss Franc", new Boolean(false)},
{"Lithuania", "Vilnius", "Lithuanian, Polish, Russian", "Lita", new Boolean(false)},
{"Luxembourg", "Luxembourg", "French, German, Letzeburgesch", "Luxembourg Franc", new Boolean(true)},
{"Macedonia", "Skopje", "Macedonian, Albanian, Turkish, Serbo-Croatian", "Denar", new Boolean(false)},
{"Malta", "Valletta", "Maltese, English", "Maltese Lira", new Boolean(false)},
{"Moldova", "Chisinau", "Moldovan, Russian", "Leu", new Boolean(false)},
{"Monaco", "Monaco", "French, English, Italian", "French Franc", new Boolean(false)},
{"the Netherlands", "Amsterdam", "Dutch", "Guilder", new Boolean(true)},
{"Norway", "Oslo", "Norwegian", "Krone", new Boolean(false)},
{"Poland", "Warsaw", "Polish", "Zloty", new Boolean(false)},
{"Portugal", "Lisbon", "Portuguese", "Escudo", new Boolean(true)},
{"Romania", "Bucharest", "Romanian", "Leu", new Boolean(false)},
{"Russia", "Moscow", "Russian", "Ruble", new Boolean(false)},
{"San Marino", "San Marino", "Italian", "Italian Lira", new Boolean(false)},
{"Slovakia", "Bratislava", "Slovak, Hungarian", "Koruna", new Boolean(false)},
{"Slovenia", "Ljubljana", "Slovenian, Serbo-Croatian", "Tolar", new Boolean(false)},
{"Spain", "Madrid", "Spanish", "Peseta", new Boolean(true)},
{"Sweden", "Stockholm", "Swedish", "Krona", new Boolean(false)},
{"Switzerland", "Bern", "German, French, Italian", "Swiss Franc", new Boolean(false)},
{"Turkey", "Ankara", "Turkish", "Turkish Lira", new Boolean(false)},
{"Ukraine", "Kiev", "Ukranian, Russian, Romanian, Polish, Hungarian", "Hryvnia", new Boolean(false)},
{"United Kingdom", "London", "English, Welsh", "British Pound", new Boolean(true)},
{"Yugoslavia", "Belgrade", "Serbo-Croatian, Slovenian, Macedonian", "Dinar", new Boolean(false)},
};
// Table model
TableModel dataModel = new AbstractTableModel() {
public int getColumnCount() {
return headers.length;
}
public int getRowCount() {
return data.length;
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
public String getColumnName(int column) {
return headers[column];
}
public Class getColumnClass(int col) {
return getValueAt(0, col).getClass();
}
public void setValueAt(Object aValue, int row, int column) {
data[row][column] = aValue;
}
public boolean isCellEditable(int row, int col) {
return (col == 4);
}
};
// Create table with table model
JTable countryTable = new JTable(dataModel);
countryTable.setGridColor(Color.pink);
countryTable.setBackground(Color.white);
countryTable.setForeground(Color.black);
return countryTable;
}
}
/*
* Copyright 2010 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
/* @test
@bug 6884066
@summary JTableHeader listens mouse in disabled state and doesn't work when not attached to a table
@author Alexander Potochkin
@run main bug6884066
*/
import sun.awt.SunToolkit;
import javax.swing.*;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableColumn;
import java.awt.*;
import java.awt.event.InputEvent;
import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;
public class bug6884066 {
private static JTableHeader header;
public static void main(String[] args) throws Exception {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
Robot robot = new Robot();
robot.setAutoDelay(20);
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
// just to quickly grab a column model
JTable table = new JTable(10, 5);
header = new JTableHeader(table.getColumnModel());
checkColumn(0, "A");
JFrame frame = new JFrame("standalone header");
frame.add(header);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
});
toolkit.realSync();
Point point = header.getLocationOnScreen();
robot.mouseMove(point.x + 3, point.y + 3);
robot.mousePress(InputEvent.BUTTON1_MASK);
for (int i = 0; i < header.getWidth() - 3; i++) {
robot.mouseMove(point.x + i, point.y + 3);
}
robot.mouseRelease(InputEvent.BUTTON1_MASK);
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
TableColumnModel model = header.getColumnModel();
checkColumn(model.getColumnCount() - 1, "A");
}
});
}
private static void checkColumn(int index, String str) {
TableColumnModel model = header.getColumnModel();
Object value = model.getColumn(index).getHeaderValue();
if (!str.equals(value)) {
throw new RuntimeException("Unexpected header's value; " +
"index = " + index + " value = " + value);
}
}
}
/*
* Copyright 2010 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
/* @test
@bug 6889007
@summary No resize cursor during hovering mouse over JTable
@author Alexander Potochkin
*/
import sun.awt.SunToolkit;
import javax.swing.*;
import javax.swing.plaf.basic.BasicTableHeaderUI;
import javax.swing.table.JTableHeader;
import java.awt.*;
public class bug6889007 {
public static void main(String[] args) throws Exception {
SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
Robot robot = new Robot();
robot.setAutoDelay(20);
final JFrame frame = new JFrame();
frame.setUndecorated(true);
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTableHeader th = new JTableHeader();
th.setColumnModel(new JTable(20, 5).getColumnModel());
th.setUI(new MyTableHeaderUI());
frame.add(th);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
toolkit.realSync();
Point point = frame.getLocationOnScreen();
int shift = 10;
int x = point.x;
int y = point.y + frame.getHeight()/2;
for(int i = -shift; i < frame.getWidth() + 2*shift; i++) {
robot.mouseMove(x++, y);
}
toolkit.realSync();
// 9 is a magic test number
if (MyTableHeaderUI.getTestValue() != 9) {
throw new RuntimeException("Unexpected test number "
+ MyTableHeaderUI.getTestValue());
}
System.out.println("ok");
}
static class MyTableHeaderUI extends BasicTableHeaderUI {
private static int testValue;
protected void rolloverColumnUpdated(int oldColumn, int newColumn) {
increaseTestValue(newColumn);
Cursor cursor = Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR);
if (oldColumn != -1 && newColumn != -1 &&
header.getCursor() != cursor) {
throw new RuntimeException("Wrong type of cursor!");
}
}
private static synchronized void increaseTestValue(int increment) {
testValue += increment;
}
public static synchronized int getTestValue() {
return testValue;
}
}
}
/*
* Copyright 2010 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
/* @test
* @bug 6925473
* @summary REGRESSION: JOptionPane in dialog is full-screen height
* @author Pavel Porvatov
* @run main bug6925473
*/
import javax.swing.*;
import java.awt.*;
public class bug6925473 {
private static final String LONG_TEXT = "Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. " +
"DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. " +
"This code is free software; you can redistribute it and/or modify it " +
"under the terms of the GNU General Public License version 2 only, as " +
"published by the Free Software Foundation. ";
public static void main(String[] args) throws Exception {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
JTextArea textArea = new JTextArea(LONG_TEXT);
Dimension preferredSize = textArea.getPreferredSize();
if (preferredSize.width <= 0 || preferredSize.height <= 0) {
throw new RuntimeException("Invalid preferred size " + preferredSize);
}
JTextArea textAreaLW = new JTextArea(LONG_TEXT);
textAreaLW.setLineWrap(true);
Dimension preferredSizeLW = textAreaLW.getPreferredSize();
if (preferredSizeLW.width <= 0 || preferredSizeLW.height <= 0) {
throw new RuntimeException("Invalid preferred size " + preferredSizeLW);
}
}
});
}
}
/*
* Copyright 2010 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
/* @test
* @bug 6940863
* @summary Textarea within scrollpane shows vertical scrollbar
* @author Pavel Porvatov
* @run main bug6940863
*/
import sun.awt.OSInfo;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class bug6940863 {
private static JFrame frame;
private static JScrollPane scrollPane;
private static final Timer timer = new Timer(1000, new ActionListener() {
public void actionPerformed(ActionEvent e) {
boolean failed = scrollPane.getVerticalScrollBar().isShowing() ||
scrollPane.getHorizontalScrollBar().isShowing();
frame.dispose();
if (failed) {
throw new RuntimeException("The test failed");
}
}
});
public static void main(String[] args) throws Exception {
if (OSInfo.getOSType() != OSInfo.OSType.WINDOWS) {
System.out.println("The test is suitable only for Windows OS. Skipped");
}
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
JTextArea textArea = new JTextArea();
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
scrollPane = new JScrollPane(textArea);
scrollPane.setMinimumSize(new Dimension(200, 100));
scrollPane.setPreferredSize(new Dimension(300, 150));
frame = new JFrame("Vertical scrollbar shown without text");
frame.setContentPane(scrollPane);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
timer.setRepeats(false);
timer.start();
}
});
}
}
...@@ -30,60 +30,50 @@ ...@@ -30,60 +30,50 @@
import javax.swing.*; import javax.swing.*;
import java.awt.*; import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Test6593649 extends JFrame { public class Test6593649 {
static JTextArea txt; private static JFrame frame;
static JPanel innerPanel;
public Test6593649(Dimension d) private static JTextArea textArea;
{
super("Word Wrap Testcase");
setSize(d); private static final Timer timer = new Timer(1000, new ActionListener() {
public void actionPerformed(ActionEvent e) {
boolean failed = !textArea.getParent().getSize().equals(textArea.getSize());
final Container contentPane = getContentPane(); frame.dispose();
innerPanel = new JPanel(); if (failed) {
innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.LINE_AXIS)); throw new RuntimeException("The test failed");
}
}
});
txt = new JTextArea("This is a long line that should wrap, but doesn't..."); public static void main(String[] args) throws Exception {
txt.setLineWrap(true); SwingUtilities.invokeAndWait(new Runnable() {
txt.setWrapStyleWord(true); public void run() {
frame = new JFrame();
innerPanel.add(txt); frame.setSize(200, 100);
contentPane.add(innerPanel, BorderLayout.SOUTH); textArea = new JTextArea("This is a long line that should wrap, but doesn't...");
}
public static void main(String[] args) throws InterruptedException textArea.setLineWrap(true);
{ textArea.setWrapStyleWord(true);
int size = 100;
Dimension d;
Test6593649 cp;
Dimension txtSize;
Dimension innerSize;
Dimension cpSize;
while (size <= 600) JPanel innerPanel = new JPanel();
{
d = new Dimension(size, size);
cp = new Test6593649(d);
cp.setVisible(true);
txtSize = txt.getPreferredSize(); innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.LINE_AXIS));
innerSize = innerPanel.getPreferredSize(); innerPanel.add(textArea);
cpSize = cp.getSize();
if (!(txtSize.getWidth() == innerPanel.getWidth() && txtSize.getHeight() == innerPanel.getHeight() && frame.getContentPane().add(innerPanel, BorderLayout.SOUTH);
txtSize.getWidth() <= cpSize.getWidth() && txtSize.getHeight() <= cpSize.getHeight()))
{
throw new RuntimeException("Test failed: Text area size does not properly match panel and frame sizes");
}
Thread.sleep(2000); frame.setVisible(true);
cp.hide(); timer.setRepeats(false);
size += 50; timer.start();
}
});
} }
}
} }
/*
* Copyright 2010 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
/* @test
* @bug 6953396
* @summary javax.swing.plaf.basic.BasicViewportUI.uninstallDefaults() is not called when UI is uninstalled
* @author Alexander Potochkin
*/
import javax.swing.*;
import javax.swing.plaf.basic.BasicViewportUI;
public class bug6953396 {
static volatile boolean flag;
public static void main(String[] args) throws Exception {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
BasicViewportUI ui = new BasicViewportUI() {
@Override
protected void installDefaults(JComponent c) {
super.installDefaults(c);
flag = true;
}
@Override
protected void uninstallDefaults(JComponent c) {
super.uninstallDefaults(c);
flag = false;
}
};
JViewport viewport = new JViewport();
viewport.setUI(ui);
viewport.setUI(null);
}
});
if (flag) {
throw new RuntimeException("uninstallDefaults() hasn't been called");
}
}
}
<html>
<body>
If the border is painted over scroll bars then test fails.
Otherwise test passes.
<applet width="600" height="300" code="Test6910490.class">
</applet>
</body>
</html>
/*
* Copyright 2010 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
import static java.awt.Color.RED;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
import javax.swing.Icon;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.border.MatteBorder;
/*
* @test
* @bug 6910490
* @summary Tests a matte border around a component inside a scroll pane.
* @author Sergey Malenkov
* @run applet/manual=yesno Test6910490.html
*/
public class Test6910490 extends JApplet implements Icon {
@Override
public void init() {
Insets insets = new Insets(10, 10, 10, 10);
Dimension size = new Dimension(getWidth() / 2, getHeight());
JSplitPane pane = new JSplitPane(
JSplitPane.HORIZONTAL_SPLIT,
create("Color", size, new MatteBorder(insets, RED)),
create("Icon", size, new MatteBorder(insets, this)));
pane.setDividerLocation(size.width - pane.getDividerSize() / 2);
add(pane);
}
private JScrollPane create(String name, Dimension size, MatteBorder border) {
JButton button = new JButton(name);
button.setPreferredSize(size);
button.setBorder(border);
return new JScrollPane(button);
}
public int getIconWidth() {
return 10;
}
public int getIconHeight() {
return 10;
}
public void paintIcon(Component c, Graphics g, int x, int y) {
g.setColor(RED);
g.fillRect(x, y, getIconWidth(), getIconHeight());
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册