001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017:
018: /**
019: * @author Anton Avtamonov
020: * @version $Revision$
021: */package javax.swing.plaf.basic;
022:
023: import java.awt.event.ActionEvent;
024:
025: import javax.swing.AbstractAction;
026: import javax.swing.Action;
027: import javax.swing.InputMap;
028: import javax.swing.JComponent;
029: import javax.swing.JScrollBar;
030: import javax.swing.JScrollPane;
031: import javax.swing.KeyStroke;
032:
033: import org.apache.harmony.x.swing.Utilities;
034:
035: class BasicScrollPaneKeyboardActions {
036: private abstract static class PassThroughAction extends
037: AbstractAction {
038: protected static void passThroughEvent(final ActionEvent event,
039: final JComponent destinationComponent,
040: final String correspondingCommand) {
041: if (!destinationComponent.isVisible()) {
042: return;
043: }
044: Action action = destinationComponent.getActionMap().get(
045: correspondingCommand);
046: if (action != null) {
047: action.actionPerformed(new ActionEvent(
048: destinationComponent,
049: ActionEvent.ACTION_PERFORMED,
050: correspondingCommand, event.getWhen(), event
051: .getModifiers()));
052: }
053: }
054: }
055:
056: private abstract static class PassThroughToVerticalScrollbarAction
057: extends PassThroughAction {
058: protected static void passThroughEvent(final ActionEvent event,
059: final String correspondingCommand) {
060: JScrollPane scrollPane = (JScrollPane) event.getSource();
061: JScrollBar vsb = scrollPane.getVerticalScrollBar();
062: passThroughEvent(event, vsb, correspondingCommand);
063: }
064: }
065:
066: private abstract static class PassThroughToHorizontalScrollbarAction
067: extends PassThroughAction {
068: protected static void passThroughEvent(final ActionEvent event,
069: final String correspondingCommand) {
070: JScrollPane scrollPane = (JScrollPane) event.getSource();
071: JScrollBar hsb = scrollPane.getHorizontalScrollBar();
072: passThroughEvent(event, hsb, correspondingCommand);
073: }
074: }
075:
076: private static PassThroughAction unitScrollRightAction = new PassThroughToHorizontalScrollbarAction() {
077: public void actionPerformed(final ActionEvent e) {
078: passThroughEvent(e, "positiveUnitIncrement");
079: }
080: };
081:
082: private static PassThroughAction unitScrollLeftAction = new PassThroughToHorizontalScrollbarAction() {
083: public void actionPerformed(final ActionEvent e) {
084: passThroughEvent(e, "negativeUnitIncrement");
085: }
086: };
087:
088: private static PassThroughAction unitScrollUpAction = new PassThroughToVerticalScrollbarAction() {
089: public void actionPerformed(final ActionEvent e) {
090: passThroughEvent(e, "negativeUnitIncrement");
091: }
092: };
093:
094: private static PassThroughAction unitScrollDownAction = new PassThroughToVerticalScrollbarAction() {
095: public void actionPerformed(final ActionEvent e) {
096: passThroughEvent(e, "positiveUnitIncrement");
097: }
098: };
099:
100: private static PassThroughAction scrollDownAction = new PassThroughToVerticalScrollbarAction() {
101: public void actionPerformed(final ActionEvent e) {
102: passThroughEvent(e, "positiveBlockIncrement");
103: }
104: };
105:
106: private static PassThroughAction scrollUpAction = new PassThroughToVerticalScrollbarAction() {
107: public void actionPerformed(final ActionEvent e) {
108: passThroughEvent(e, "negativeBlockIncrement");
109: }
110: };
111:
112: private static PassThroughAction scrollLeftAction = new PassThroughToHorizontalScrollbarAction() {
113: public void actionPerformed(final ActionEvent e) {
114: passThroughEvent(e, "negativeBlockIncrement");
115: }
116: };
117:
118: private static PassThroughAction scrollRightAction = new PassThroughToHorizontalScrollbarAction() {
119: public void actionPerformed(final ActionEvent e) {
120: passThroughEvent(e, "positiveBlockIncrement");
121: }
122: };
123:
124: private static PassThroughAction scrollHomeAction = new PassThroughAction() {
125: public void actionPerformed(final ActionEvent e) {
126: JScrollPane scrollPane = (JScrollPane) e.getSource();
127:
128: JScrollBar vsb = scrollPane.getVerticalScrollBar();
129: passThroughEvent(e, vsb, "minScroll");
130: JScrollBar hsb = scrollPane.getHorizontalScrollBar();
131: passThroughEvent(e, hsb, "minScroll");
132: }
133: };
134:
135: private static PassThroughAction scrollEndAction = new PassThroughAction() {
136: public void actionPerformed(final ActionEvent e) {
137: JScrollPane scrollPane = (JScrollPane) e.getSource();
138:
139: JScrollBar vsb = scrollPane.getVerticalScrollBar();
140: passThroughEvent(e, vsb, "maxScroll");
141: JScrollBar hsb = scrollPane.getHorizontalScrollBar();
142: passThroughEvent(e, hsb, "maxScroll");
143: }
144: };
145:
146: public static void installKeyboardActions(
147: final JScrollPane scrollPane) {
148: Utilities.installKeyboardActions(scrollPane,
149: JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT,
150: "ScrollPane.ancestorInputMap",
151: "ScrollPane.ancestorInputMap.RightToLeft");
152:
153: scrollPane.getActionMap().put("unitScrollRight",
154: unitScrollRightAction);
155: scrollPane.getActionMap().put("unitScrollDown",
156: unitScrollDownAction);
157: scrollPane.getActionMap().put("unitScrollLeft",
158: unitScrollLeftAction);
159: scrollPane.getActionMap().put("unitScrollUp",
160: unitScrollUpAction);
161: scrollPane.getActionMap().put("scrollUp", scrollUpAction);
162: scrollPane.getActionMap().put("scrollDown", scrollDownAction);
163: scrollPane.getActionMap().put("scrollLeft", scrollLeftAction);
164: scrollPane.getActionMap().put("scrollRight", scrollRightAction);
165: scrollPane.getActionMap().put("scrollHome", scrollHomeAction);
166: scrollPane.getActionMap().put("scrollEnd", scrollEndAction);
167: }
168:
169: public static void uninstallKeyboardActions(
170: final JScrollPane scrollPane) {
171: Utilities.uninstallKeyboardActions(scrollPane,
172: JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
173: }
174:
175: private static void appendInputMap(final InputMap source,
176: final InputMap additional) {
177: KeyStroke[] keyStrokes = additional.keys();
178: for (int i = 0; i < keyStrokes.length; i++) {
179: source.put(keyStrokes[i], additional.get(keyStrokes[i]));
180: }
181: }
182: }
|