/*
* Created on 13.02.2007
*
*/
package org.jdesktop.swingx.appframework;
import java.awt.Dialog;
import java.awt.Frame;
import java.awt.KeyboardFocusManager;
import java.awt.Point;
import java.awt.Window;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import org.jdesktop.application.Application;
import org.jdesktop.application.ApplicationContext;
import org.jdesktop.swingx.JXDialog;
import org.jdesktop.swingx.search.AbstractSearchable;
import org.jdesktop.swingx.search.SearchFactory;
import org.jdesktop.swingx.search.Searchable;
public class AppSearchFactory extends SearchFactory {
private static final Logger LOG = Logger.getLogger(AppSearchFactory.class
.getName());
/**
* Size and locate the dialog, respecting user preferences.
* Locates the dialog at location if not null. Otherwise tries
* to read stored session state from the ApplicationContext. As a last
* fallback, centers the dialog relative to its owner.
*
* @param findDialog the dialog to size and locate
* @param location the internally stored location, may be null.
*/
private void locateDialog(JXDialog findDialog, Point location) {
Window owner = findDialog.getOwner();
findDialog.pack();
if (location == null) {
// the first time creation in this app's life-cycle
findDialog.setLocationRelativeTo(owner);
Application application = Application.getInstance(Application.class);
ApplicationContext appContext = application.getContext();
try {
if (application instanceof SingleXFrameApplication) {
((SingleXFrameApplication) application).prepareDialog(findDialog, false);
} else {
appContext.getSessionStorage().restore(findDialog, "findDialog.session.xml");
}
}
catch (IOException e) {
LOG.log(Level.WARNING, "couldn't restore sesssion", e);
} catch (SecurityException e) {
LOG.log(Level.WARNING, "couldn't restore sesssion", e);
}
} else {
// all other times - swingx internals take over re-location
findDialog.setLocation(location);
}
}
@Override
public void showFindDialog(JComponent target, Searchable searchable) {
Window frame = null; //JOptionPane.getRootFrame();
if (target != null) {
target.putClientProperty(AbstractSearchable.MATCH_HIGHLIGHTER, Boolean.FALSE);
frame = SwingUtilities.getWindowAncestor(target);
// if (window instanceof Frame) {
// frame = (Frame) window;
// }
}
JXDialog topLevel = getDialogForSharedFilePanel();
JXDialog findDialog;
if ((topLevel != null) && (topLevel.getOwner().equals(frame))) {
findDialog = topLevel;
KeyboardFocusManager.getCurrentKeyboardFocusManager().focusNextComponent(findDialog);
} else {
Point location = hideSharedFindPanel(true);
if (frame instanceof Frame) {
findDialog = new JXDialog((Frame) frame, getSharedFindPanel());
} else if (frame instanceof Dialog) {
// fix #215-swingx: had problems with secondary modal dialogs.
findDialog = new JXDialog((Dialog) frame, getSharedFindPanel());
} else {
findDialog = new JXDialog(JOptionPane.getRootFrame(), getSharedFindPanel());
}
findDialog.setName("findDialog");
locateDialog(findDialog, location);
}
findDialog.setVisible(true);
installFindRemover(target, findDialog);
getSharedFindPanel().setSearchable(searchable);
}
private JXDialog getDialogForSharedFilePanel() {
if (findPanel == null) return null;
Window window = SwingUtilities.getWindowAncestor(findPanel);
return (window instanceof JXDialog) ? (JXDialog) window : null;
}
public void updateUI() {
if (findPanel != null) {
SwingUtilities.updateComponentTreeUI(findPanel);
}
if (findBar != null) {
SwingUtilities.updateComponentTreeUI(findBar);
}
}
}