001: /*
002: * The contents of this file are subject to the Mozilla Public License
003: * Version 1.1 (the "License"); you may not use this file except in
004: * compliance with the License. You may obtain a copy of the License at
005: * http://www.mozilla.org/MPL/
006: *
007: * Software distributed under the License is distributed on an "AS IS"
008: * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
009: * License for the specific language governing rights and limitations
010: * under the License.
011: *
012: * The Original Code is iSQL-Viewer, A Mutli-Platform Database Tool.
013: *
014: * The Initial Developer of the Original Code is iSQL-Viewer, A Mutli-Platform Database Tool.
015: * Portions created by Mark A. Kobold are Copyright (C) 2000-2007. All Rights Reserved.
016: *
017: * Contributor(s):
018: * Mark A. Kobold [mkobold <at> isqlviewer <dot> com].
019: *
020: * If you didn't download this code from the following link, you should check
021: * if you aren't using an obsolete version: http://www.isqlviewer.com
022: */
023: package org.isqlviewer.ui.listeners;
024:
025: import java.awt.Component;
026: import java.awt.Cursor;
027: import java.awt.event.MouseEvent;
028: import java.awt.event.MouseListener;
029: import java.util.concurrent.atomic.AtomicBoolean;
030:
031: import javax.swing.JScrollPane;
032: import javax.swing.JTree;
033: import javax.swing.SwingUtilities;
034: import javax.swing.event.TreeExpansionEvent;
035: import javax.swing.event.TreeExpansionListener;
036: import javax.swing.tree.TreePath;
037:
038: import org.isqlviewer.model.JdbcSchemaTreeModel;
039: import org.isqlviewer.model.SchemaNode;
040: import org.isqlviewer.sql.ResultSetRenderer;
041: import org.isqlviewer.swing.action.SwingEventManager;
042: import org.isqlviewer.ui.dnd.SchemaNodeRenderer;
043: import org.isqlviewer.util.LoggableObject;
044:
045: /**
046: * Object for handling expansion and selection events from a JDBC Schema tree model.
047: * <p>
048: * This class is mainly responsible for the lazy loading effect since a JDBC schema can be quite large we wou
049: * realistically only want to load the stuff on demand.
050: *
051: * @author Mark A. Kobold <mkobold at isqlviewer dot com>
052: * @version 1.0
053: */
054: public class SchemaTreeListener extends LoggableObject implements
055: MouseListener, TreeExpansionListener {
056:
057: private JdbcSchemaTreeModel jdbcSchema = null;
058: private SwingEventManager eventManager = null;
059: private ResultSetRenderer renderer = null;
060: private AtomicBoolean treeExpansionLock = new AtomicBoolean(false);
061:
062: public SchemaTreeListener(JdbcSchemaTreeModel jdbcSchema,
063: ResultSetRenderer renderer, SwingEventManager eventManager) {
064:
065: this .jdbcSchema = jdbcSchema;
066: this .eventManager = eventManager;
067: this .renderer = renderer;
068: }
069:
070: public void treeExpanded(TreeExpansionEvent event) {
071:
072: SchemaNode node = (SchemaNode) event.getPath()
073: .getLastPathComponent();
074: if (node.isNoncached()) {
075: eventManager.enqueueRunnable(new SchemaNodeExpander(this ,
076: event));
077: }
078:
079: }
080:
081: public void treeCollapsed(TreeExpansionEvent event) {
082:
083: }
084:
085: public void mouseClicked(MouseEvent e) {
086:
087: handleInput(e);
088: }
089:
090: public void mousePressed(MouseEvent e) {
091:
092: // handleInput(e);
093: }
094:
095: public void mouseReleased(MouseEvent e) {
096:
097: }
098:
099: public void mouseEntered(MouseEvent e) {
100:
101: }
102:
103: public void mouseExited(MouseEvent e) {
104:
105: }
106:
107: private void handleInput(MouseEvent e) {
108:
109: int clickCount = e.getClickCount();
110: if (clickCount == 2 && !e.isPopupTrigger()) {
111: if (!treeExpansionLock.get()) {
112: JTree tree = (JTree) e.getSource();
113: TreePath path = tree.getSelectionPath();
114: SchemaNode node = (SchemaNode) path
115: .getLastPathComponent();
116: Runnable runnable = new SchemaNodeRenderer(renderer,
117: jdbcSchema, tree, node);
118: eventManager.enqueueRunnable(runnable);
119: }
120: }
121: }
122:
123: private static class SchemaNodeExpander implements Runnable {
124:
125: private TreeExpansionEvent event = null;
126: private JdbcSchemaTreeModel jdbcSchema = null;
127: private AtomicBoolean lock = null;
128:
129: public SchemaNodeExpander(SchemaTreeListener ownerReference,
130: TreeExpansionEvent event) {
131:
132: this .jdbcSchema = ownerReference.jdbcSchema;
133: this .event = event;
134: this .lock = ownerReference.treeExpansionLock;
135: }
136:
137: public void run() {
138:
139: if (event == null) {
140: return;
141: }
142: synchronized (lock) {
143: lock.set(true);
144: }
145: boolean cursorSet = false;
146: Component owner = null;
147: try {
148: owner = SwingUtilities.getAncestorOfClass(
149: JScrollPane.class, (Component) event
150: .getSource());
151: owner.setCursor(Cursor
152: .getPredefinedCursor(Cursor.WAIT_CURSOR));
153: cursorSet = true;
154: } catch (Exception ignored) {
155:
156: }
157: try {
158: SchemaNode node = (SchemaNode) event.getPath()
159: .getLastPathComponent();
160: jdbcSchema.loadChildNodes(node);
161: } finally {
162: if (cursorSet && owner != null) {
163: owner
164: .setCursor(Cursor
165: .getPredefinedCursor(Cursor.DEFAULT_CURSOR));
166: }
167: synchronized (lock) {
168: lock.set(false);
169: }
170: if (owner != null) {
171: owner.invalidate();
172: }
173: }
174: }
175: }
176:
177: }
|