package kiyut.ekspos;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowEvent;
import java.io.File;
import java.text.MessageFormat;
import java.util.List;
import java.util.ListIterator;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.CellEditor;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuBar;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JToolBar;
import javax.swing.SwingConstants;
import javax.swing.TransferHandler;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeCellEditor;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
import kiyut.ekspos.prefs.BrowseWindowPreferences;
import kiyut.ekspos.prefs.GeneralPreferences;
import kiyut.ekspos.prefs.IIOPreferences;
import kiyut.ekspos.pycasa.PycasaManager;
import kiyut.swing.shell.event.ShellAdapter;
import kiyut.swing.shell.event.ShellEvent;
import kiyut.swing.shell.image.ImageUtilities;
import kiyut.swing.shell.shelllistview.ShellListView;
import kiyut.swing.shell.shelllistview.ShellListViewModel;
import kiyut.swing.shell.shelllistview.ThumbnailView;
import kiyut.swing.shell.shelltreeview.ShellTreeView;
import kiyut.swing.shell.shelltreeview.ShellTreeViewModel;
import kiyut.swing.shell.util.ShellProgressMonitor;
import kiyut.swing.statusbar.StatusBar;
import kiyut.swing.statusbar.StatusBarItem;
import kiyut.swing.util.MenuFactory;
import org.flexdock.docking.DockableFactory;
import org.flexdock.docking.DockingConstants;
import org.flexdock.docking.DockingManager;
import org.flexdock.perspective.LayoutSequence;
import org.flexdock.perspective.Perspective;
import org.flexdock.perspective.PerspectiveFactory;
import org.flexdock.perspective.PerspectiveManager;
import org.flexdock.view.View;
import org.flexdock.view.Viewport;
/** BrowserWindow
*/
public class BrowserWindow extends JFrame {
public static final String EXIT_ACTION_COMMAND = "Exit";
public static final String CUT_ACTION_COMMAND = "Cut";
public static final String COPY_ACTION_COMMAND = "Copy";
public static final String PASTE_ACTION_COMMAND = "Paste";
public static final String RENAME_ACTION_COMMAND = "Rename";
public static final String DELETE_ACTION_COMMAND = "Delete";
public static final String PREFERENCES_ACTION_COMMAND = "Preferences";
public static final String DETAIL_VIEW_ACTION_COMMAND = "DetailView";
public static final String LIST_VIEW_ACTION_COMMAND = "ListView";
public static final String ICON_VIEW_ACTION_COMMAND = "IconView";
public static final String THUMBNAIL_VIEW_ACTION_COMMAND = "ThumbnailView";
public static final String RELOAD_ACTION_COMMAND = "Reload";
public static final String RESET_PERSPECTIVE_ACTION_COMMAND = "ResetPerspective";
public static final String LOCATION_ACTION_COMMAND = "Location";
public static final String UP_ACTION_COMMAND = "Up";
public static final String BACK_ACTION_COMMAND = "Back";
public static final String FORWARD_ACTION_COMMAND = "Forward";
public static final String HOME_ACTION_COMMAND = "Home";
public static final String PICASA_LOGIN_ACTION_COMMAND = "PicasaLogin";
public static final String PICASA_ADD_ACTION_COMMAND = "PicasaAdd";
public static final String PICASA_MANAGE_ACTION_COMMAND = "PicasaManage";
public static final String HELP_CONTENT_ACTION_COMMAND = "HelpContent";
public static final String TOTD_ACTION_COMMAND = "TOTD";
public static final String ABOUT_ACTION_COMMAND = "About";
private static final String DEFAULT_PERSPECTIVE = "default.perspective";
private static final String DOCKING_LIST_VIEW = "listview.view";
private static final String DOCKING_TREE_VIEW = "treeview.view";
private static final String DOCKING_PREVIEW_VIEW = "preview.view";
private ResourceBundle bundle = ResourceBundle.getBundle("kiyut.ekspos.BrowserWindow");
private Viewport viewport;
private ShellTreeView shellTreeView;
private ShellListView shellListView;
private ImagePane imagePreviewPane;
private Viewer viewer;
private ShellProgressMonitor shellProgressMonitor;
private JPopupMenu shellTreeViewPopupMenu;
private JPopupMenu shellListViewPopupMenu;
private JScrollPane shellTreeViewScroll = new JScrollPane();
private StatusBar statusBar;
private static final int HISTORY_SIZE = 9;
private List<String> historyList = new ArrayList<String>(HISTORY_SIZE);
private JComboBox locationCombo;
private List<String> locationList = new ArrayList<String>(HISTORY_SIZE);
private boolean shellListViewInProgress = false;
private boolean shellTreeViewInProgress = false;
private boolean backOrForwardInProgress = false;
private int historyIndex = 0;
/**Construct the frame*/
public BrowserWindow() {
setTitle(Application.getLongName());
setIconImage(Application.getIconImage());
BrowseWindowPreferences prefs = BrowseWindowPreferences.getInstance();
int x = prefs.getX();
int y = prefs.getY();
int width = prefs.getWidth();
int height = prefs.getHeight();
this.setSize(width,height);
if (!(x < 0 || y < 0)) {
this.setBounds(x,y,width,height);
}
JPanel contentPane = new JPanel();
contentPane.setLayout(new BorderLayout());
setContentPane(contentPane);
shellTreeView = new ShellTreeView();
shellListView = new ShellListView();
imagePreviewPane = new ImagePane();
TransferHandler transferHandler = new BrowserTransferHandler();
shellTreeView.setTransferHandler(transferHandler);
shellTreeView.setDragEnabled(true);
shellListView.setTransferHandler(transferHandler);
shellListView.setDragEnabled(true);
imagePreviewPane.setBorder(new EmptyBorder(3,3,3,3));
shellTreeView.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent evt) {
shellTreeViewValueChanged(evt);
}
});
shellListView.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
public void valueChanged(ListSelectionEvent evt) {
shellListViewValueChanged(evt);
}
});
shellListView.addListDataListener(new javax.swing.event.ListDataListener() {
public void contentsChanged(ListDataEvent evt) {
shellListViewContentsChanged(evt);
}
public void intervalAdded(ListDataEvent evt) {}
public void intervalRemoved(ListDataEvent evt) {}
});
shellListView.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent evt) { shellListViewMouseClicked(evt); }
});
shellListView.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent evt) { shellListViewKeyPressed(evt); }
});
shellProgressMonitor = new ShellProgressMonitor(this);
shellProgressMonitor.addShellListener(new ShellAdapter() {
@Override
public void shellDeleted(ShellEvent evt) { shellProgressMonitorShellDeleted(evt); }
@Override
public void shellMoved(ShellEvent evt) { shellProgressMonitorShellMoved(evt); }
//public void shellCopied(ShellEvent evt) { shellProgressMonitorShellCopied(evt); }
});
shellTreeViewScroll.setViewportView(shellTreeView);
shellTreeViewScroll.getViewport().setBackground(shellTreeView.getBackground());
statusBar = new StatusBar();
StatusBarItem statusBarItem = new StatusBarItem(" ",100,SwingConstants.CENTER);
statusBar.addItem(statusBarItem);
statusBarItem = new StatusBarItem(" ",150,SwingConstants.LEFT);
statusBar.addItem(statusBarItem);
contentPane.add(statusBar,BorderLayout.SOUTH);
initActions();
restoreFromPreferences();
// need to put inside try..catch because docking is problematic
try {
initDocking();
} catch (Exception ex) {
// do nothing
}
//WindowManager.createInstance(this);
}
/** Initialize Actions, MenuBar and ToolBar
*/
private void initActions() {
Map<String,Action> actionMap = new HashMap<String,Action>();
// create action
actionMap.put(EXIT_ACTION_COMMAND,new BrowserAction(EXIT_ACTION_COMMAND));
actionMap.put(CUT_ACTION_COMMAND,new BrowserAction(CUT_ACTION_COMMAND));
actionMap.put(COPY_ACTION_COMMAND,new BrowserAction(COPY_ACTION_COMMAND));
actionMap.put(PASTE_ACTION_COMMAND,new BrowserAction(PASTE_ACTION_COMMAND));
actionMap.put(RENAME_ACTION_COMMAND,new BrowserAction(RENAME_ACTION_COMMAND));
actionMap.put(DELETE_ACTION_COMMAND,new BrowserAction(DELETE_ACTION_COMMAND));
actionMap.put(PREFERENCES_ACTION_COMMAND,new BrowserAction(PREFERENCES_ACTION_COMMAND));
actionMap.put(DETAIL_VIEW_ACTION_COMMAND,new BrowserAction(DETAIL_VIEW_ACTION_COMMAND));
actionMap.put(LIST_VIEW_ACTION_COMMAND,new BrowserAction(LIST_VIEW_ACTION_COMMAND));
actionMap.put(ICON_VIEW_ACTION_COMMAND,new BrowserAction(ICON_VIEW_ACTION_COMMAND));
actionMap.put(THUMBNAIL_VIEW_ACTION_COMMAND,new BrowserAction(THUMBNAIL_VIEW_ACTION_COMMAND));
actionMap.put(RELOAD_ACTION_COMMAND,new BrowserAction(RELOAD_ACTION_COMMAND));
actionMap.put(RESET_PERSPECTIVE_ACTION_COMMAND,new BrowserAction(RESET_PERSPECTIVE_ACTION_COMMAND));
actionMap.put(LOCATION_ACTION_COMMAND,new BrowserAction(LOCATION_ACTION_COMMAND));
actionMap.put(UP_ACTION_COMMAND,new BrowserAction(UP_ACTION_COMMAND));
actionMap.put(BACK_ACTION_COMMAND,new BrowserAction(BACK_ACTION_COMMAND));
actionMap.put(FORWARD_ACTION_COMMAND,new BrowserAction(FORWARD_ACTION_COMMAND));
actionMap.put(HOME_ACTION_COMMAND,new BrowserAction(HOME_ACTION_COMMAND));
actionMap.put(PICASA_LOGIN_ACTION_COMMAND,new BrowserAction(PICASA_LOGIN_ACTION_COMMAND));
actionMap.put(PICASA_ADD_ACTION_COMMAND,new BrowserAction(PICASA_ADD_ACTION_COMMAND));
actionMap.put(PICASA_MANAGE_ACTION_COMMAND,new BrowserAction(PICASA_MANAGE_ACTION_COMMAND));
actionMap.put(HELP_CONTENT_ACTION_COMMAND,new BrowserAction(HELP_CONTENT_ACTION_COMMAND));
actionMap.put(TOTD_ACTION_COMMAND,new BrowserAction(TOTD_ACTION_COMMAND));
actionMap.put(ABOUT_ACTION_COMMAND,new BrowserAction(ABOUT_ACTION_COMMAND));
// inititalize action from ResourceBundle
MenuFactory.configureActionMap(bundle,actionMap);
// initialize menuBar
JMenuBar menuBar = MenuFactory.createMenuBar(bundle,actionMap);
setJMenuBar(menuBar);
// initialize navigation toolBar
JPanel toolBarPane = new JPanel();
toolBarPane.setLayout(new BorderLayout());
getContentPane().add(toolBarPane, BorderLayout.NORTH);
JToolBar toolBar = new JToolBar();
toolBar.setFloatable(false);
toolBar.setRollover(true);
toolBarPane.add(toolBar,BorderLayout.NORTH);
toolBar.add(createToolBarButton(actionMap.get(BACK_ACTION_COMMAND)));
toolBar.add(createToolBarButton(actionMap.get(FORWARD_ACTION_COMMAND)));
toolBar.add(createToolBarButton(actionMap.get(UP_ACTION_COMMAND)));
toolBar.add(createToolBarButton(actionMap.get(HOME_ACTION_COMMAND)));
toolBar.add(createToolBarButton(actionMap.get(RELOAD_ACTION_COMMAND)));
toolBar.addSeparator();
toolBar.add(createToolBarButton(actionMap.get(DETAIL_VIEW_ACTION_COMMAND)));
toolBar.add(createToolBarButton(actionMap.get(LIST_VIEW_ACTION_COMMAND)));
toolBar.add(createToolBarButton(actionMap.get(ICON_VIEW_ACTION_COMMAND)));
toolBar.add(createToolBarButton(actionMap.get(THUMBNAIL_VIEW_ACTION_COMMAND)));
toolBar.addSeparator();
toolBar.add(createToolBarButton(actionMap.get(PREFERENCES_ACTION_COMMAND)));
toolBar.add(createToolBarButton(actionMap.get(ABOUT_ACTION_COMMAND)));
// initialize address toolBar
toolBar = new JToolBar();
toolBar.setFloatable(false);
toolBar.setRollover(true);
toolBarPane.add(toolBar,BorderLayout.SOUTH);
JLabel locationLabel = new JLabel("Location ");
locationCombo = new JComboBox();
locationCombo.setEditable(true);
Action action = actionMap.get(LOCATION_ACTION_COMMAND);
locationCombo.setActionCommand((String)action.getValue(Action.ACTION_COMMAND_KEY));
locationCombo.setAction(action);
toolBar.add(locationLabel);
toolBar.add(locationCombo);
////////////////////
// ShellTreeView
///////////////////
shellTreeViewPopupMenu = MenuFactory.createPopupMenu(bundle,actionMap,"ShellTreeViewPopupMenu");
shellTreeView.addMouseListener(new java.awt.event.MouseAdapter() {
@Override
public void mouseClicked(MouseEvent evt) {}
@Override
public void mousePressed(MouseEvent evt) { shellTreeViewPopupTrigger(evt); }
@Override
public void mouseReleased(MouseEvent evt) { shellTreeViewPopupTrigger(evt); }
});
shellTreeView.getCellEditor().addCellEditorListener(new javax.swing.event.CellEditorListener() {
public void editingStopped(ChangeEvent evt) { shellTreeViewEditingStopped(evt); }
public void editingCanceled(ChangeEvent evt) { }
});
////////////////////
// ShellListView
///////////////////
shellListViewPopupMenu = MenuFactory.createPopupMenu(bundle,actionMap,"ShellListViewPopupMenu");
shellListView.addMouseListener(new java.awt.event.MouseAdapter() {
@Override
public void mouseClicked(MouseEvent evt) {}
@Override
public void mousePressed(MouseEvent evt) { shellListViewPopupTrigger(evt); }
@Override
public void mouseReleased(MouseEvent evt) { shellListViewPopupTrigger(evt); }
});
shellListView.addCellEditorListener(new javax.swing.event.CellEditorListener() {
public void editingStopped(ChangeEvent evt) { shellListViewEditingStopped(evt); }
public void editingCanceled(ChangeEvent evt) { }
});
}
private JButton createToolBarButton(Action action) {
JButton button = new JButton(action);
button.setText("");
button.setFocusable(false);
//button.setBorderPainted(false);
//button.setMargin(new Insets(2,2,2,2));
return button;
}
private void initDocking() {
// create docking view
JPanel contentPane = (JPanel)getContentPane();
viewport = new Viewport();
contentPane.add(viewport, BorderLayout.CENTER);
// setup the DockingManager to work with our application
DockingManager.setDockableFactory(new ViewFactory());
//DockingManager.setMainDockingPort(this,"BrowserWindow");
PerspectiveManager.setFactory(new BrowserPerspectiveFactory());
PerspectiveManager.setRestoreFloatingOnLoad(false);
PerspectiveManager mgr = PerspectiveManager.getInstance();
mgr.setCurrentPerspective(DEFAULT_PERSPECTIVE, false);
mgr.reset(this);
//DockingManager.restoreLayout();
}
public void restoreDocking() {
BrowseWindowPreferences framePrefs = BrowseWindowPreferences.getInstance();
int frameState = framePrefs.getExtendedState();
if (Toolkit.getDefaultToolkit().isFrameStateSupported(frameState) == true) {
this.setExtendedState(frameState);
// wait till extendedState really done
do {
try {
Thread.sleep(200);
} catch (InterruptedException ex) {
// do nothing
}
} while (frameState != this.getExtendedState() && this.isValid());
}
try {
DockingManager.loadLayoutModel();
DockingManager.restoreLayout();
} catch(Exception ex) {
ex.printStackTrace(System.err);
}
if (!(shellTreeView.isDisplayable() && shellListView.isDisplayable() && imagePreviewPane.isDisplayable())) {
resetPerspective();
System.err.println("[Ekspos] restoreDocking reset perspective");
}
}
private void resetPerspective() {
PerspectiveManager mgr = PerspectiveManager.getInstance();
mgr.remove(DEFAULT_PERSPECTIVE);
mgr.setCurrentPerspective(DEFAULT_PERSPECTIVE, false);
mgr.reset(this);
//DockingManager.restoreLayout();
}
/** Set value using preferences
* later don't use this, use listener instead
*/
public void restoreFromPreferences() {
GeneralPreferences generalPrefs = GeneralPreferences.getInstance();
IIOPreferences iioPrefs = IIOPreferences.getInstance();
boolean useCache = generalPrefs.getBoolean(GeneralPreferences.USE_CACHE_KEY);
ThumbnailView thumbnailView = shellListView.getThumbnailView();
if (useCache == true) {
String str = GeneralPreferences.getInstance().getString(GeneralPreferences.CACHE_DIRECTORY_KEY);
File cacheDirectory = new File(str);
if (cacheDirectory.exists() == false) {
cacheDirectory.mkdirs();
}
thumbnailView.setCacheDirectory(cacheDirectory);
}
thumbnailView.setUseCache(useCache);
thumbnailView.setImageReaderWriterPreferences(iioPrefs.getImageReaderWriterPreferences());
}
/** Overridden to save the prefs
* {@inheritDoc}
*/
@Override
protected void processWindowEvent(WindowEvent evt) {
if (evt.getID() == WindowEvent.WINDOW_CLOSING) {
exitForm();
}
super.processWindowEvent(evt);
}
/** Exit */
private void exitForm() {
savePrefs();
setVisible(false);
dispose();
//System.exit(0);
}
private void savePrefs() {
BrowseWindowPreferences windowPrefs = BrowseWindowPreferences.getInstance();
windowPrefs.setExtendedState(this.getExtendedState());
if (this.getExtendedState() != JFrame.NORMAL) {
windowPrefs.setBounds(-1,-1,760,500);
} else {
Rectangle rv = getBounds();
windowPrefs.setBounds(rv);
}
windowPrefs.save();
try {
DockingManager.storeLayoutModel();
} catch(Exception ex) {
ex.printStackTrace(System.err);
}
}
/** Set Start Path, by default it is using user.home
* @param path path
*/
public void setStartPath(String path) {
File file = new File(System.getProperty("user.home","."));
if (path != null) {
File tmpFile = new File(path);
if (tmpFile.exists()) {
file = tmpFile;
}
}
shellTreeView.setSelection(file);
}
/** Sets the view style.
* @param viewStyle One of the following constants defined in {@code ShellListView}: VS_DETAIL, VS_LIST, VS_ICON, VS_THUMBNAIL
* @throws IllegalArgumentException if {@code ViewStyle} is an illegal viewStyle
*/
public void setViewStyle(int viewStyle) {
shellListView.setViewStyle(viewStyle);
}
public void setViewer(Viewer viewer) {
this.viewer = viewer;
}
/** Open ViewerWindow */
protected void openViewerWindow() {
if (viewer == null) { return; }
List<File> files = shellListView.getSelectedFiles();
if (files != null) {
if (files.size() == 1) {
if (files.get(0).isDirectory()) { return; }
files = shellListView.getAllFiles();
ListIterator<File> li = files.listIterator();
while (li.hasNext()) {
File file = li.next();
if (ImageUtilities.isFileImage(file) == false) {
li.remove();
}
}
}
if (files.size() <= 0) {
return;
}
File file = shellListView.getLastSelectedFile();
int indexOf = files.indexOf(file);
if (indexOf < 0) {
indexOf = 0;
}
final List<File> fileList = files;
final int index = indexOf;
//WindowManager.getInstance().openViewerWindow(fileList, index);
viewer.view(fileList, index);
}
}
protected synchronized void updateLocationModel(File file) {
String pathString = file.toString();
// location stuff
int index = locationList.indexOf(pathString);
if (index > -1) {
locationList.remove(index);
locationList.add(0,pathString);
} else {
locationList.add(0,pathString);
if (locationList.size() > HISTORY_SIZE) {
locationList.remove(HISTORY_SIZE-1);
}
}
locationCombo.removeAllItems();
//ComboBoxModel model = locationCombo.getModel();
for (int i=0; i<locationList.size(); i++) {
locationCombo.addItem(locationList.get(i));
}
//locationCombo.setSelectedItem(pathString);
}
protected synchronized void updateHistory(File file) {
if (backOrForwardInProgress == true) { return; }
// history stuff
boolean append = true;
if (historyList.size() > 0) {
String str = historyList.get(0);
if (str.equals(file.toString())) {
append = false;
}
}
if (append == true) {
historyList.add(0,file.toString());
}
while (historyList.size() > HISTORY_SIZE) {
historyList.remove(historyList.size()-1);
}
}
/** Display Error Dialog that the param does not exists
* @param file File
*/
protected void displayErrorFileNotExists(File file) {
Object[] args = {file.toString()};
JOptionPane.showMessageDialog(this,MessageFormat.format(bundle.getString("message.fileNotExists.text"),args),bundle.getString("message.fileNotExists.title"), JOptionPane.ERROR_MESSAGE);
}
/** Login to Picasa Web Album */
private void picasaLogin() {
EventQueue.invokeLater(new Runnable() {
public void run() {
PycasaManager.getInstance().openLoginDialog(BrowserWindow.this);
}
});
}
/** Upload selected files to Picasa Web Album */
private void picasaAdd() {
List<File> files = shellListView.getSelectedFiles();
if (files != null) {
if (files.size() == 1) {
if (files.get(0).isDirectory()) { return; }
}
ListIterator<File> li = files.listIterator();
while (li.hasNext()) {
File file = li.next();
if (ImageUtilities.isFileImage(file) == false) {
li.remove();
}
}
}
final List<File> selectedFiles = files;
EventQueue.invokeLater(new Runnable() {
public void run() {
PycasaManager.getInstance().openAddPhotoWindow(BrowserWindow.this, selectedFiles);
}
});
}
/** Manage Picasa Web Album */
private void picasaManage() {
EventQueue.invokeLater(new Runnable() {
public void run() {
PycasaManager.getInstance().openManageWindow(BrowserWindow.this);
}
});
}
/////////////////////////////
// Event Handler
////////////////////////////
private void shellTreeViewValueChanged(TreeSelectionEvent e) {
if (shellTreeViewInProgress == true) { return; }
shellTreeViewInProgress = true;
try {
if (!shellListViewInProgress) {
File dir = shellTreeView.getLastSelection();
if (dir != null) {
shellListView.setCurrentDirectory(dir);
shellListView.refresh();
}
}
} finally {
shellTreeViewInProgress = false;
}
}
private void shellTreeViewPopupTrigger(MouseEvent evt) {
if (evt.isPopupTrigger()) {
shellTreeViewPopupMenu.show(evt.getComponent(),evt.getX(), evt.getY());
}
}
private void shellTreeViewEditingStopped(ChangeEvent evt) {
TreeCellEditor editor = shellTreeView.getCellEditor();
DefaultMutableTreeNode node = (DefaultMutableTreeNode)shellTreeView.getLastSelectedPathComponent();
File file = (File)node.getUserObject();
File dest = new File(file.getParent() + File.separator + editor.getCellEditorValue().toString());
boolean success = false;
try {
success = file.renameTo(dest);
} catch (Exception ex) {
success = false;
}
if (success == true) {
node.setUserObject(dest);
ShellTreeViewModel dataModel = (ShellTreeViewModel)shellTreeView.getModel();
dataModel.reload(node);
TreeSelectionModel selectionModel = shellTreeView.getSelectionModel();
selectionModel.clearSelection();
selectionModel.setSelectionPath(new TreePath(node.getPath()));
} else {
JOptionPane.showMessageDialog(this, bundle.getString("message.renameException.text"), bundle.getString("message.exception.title"), JOptionPane.ERROR_MESSAGE);
}
}
private void shellListViewValueChanged(ListSelectionEvent evt) {
File file = shellListView.getLastSelectedFile();
imagePreviewPane.setProgressRepaint(GeneralPreferences.getInstance().getDouble(GeneralPreferences.PROGRESS_REPAINT_KEY));
imagePreviewPane.view(file);
}
private void shellListViewContentsChanged(ListDataEvent evt) {
if (shellListViewInProgress == true) { return; }
if (evt.getIndex0() != ShellListViewModel.ALL_INDEX && evt.getIndex1() != ShellListViewModel.ALL_INDEX) {
return;
}
shellListViewInProgress = true;
try {
// synchronize with folder tree
File dir = shellListView.getCurrentDirectory();
if (!shellTreeViewInProgress) {
shellTreeView.setSelection(dir);
}
// synchronize with history
updateLocationModel(dir);
updateHistory(dir);
locationCombo.setSelectedItem(dir.toString());
} finally {
shellListViewInProgress = false;
}
if (backOrForwardInProgress == false) {
historyIndex = 0;
}
}
private void shellListViewPopupTrigger(MouseEvent evt) {
if (evt.isPopupTrigger()) {
shellListViewPopupMenu.show(evt.getComponent(),evt.getX(), evt.getY());
}
}
private void shellListViewEditingStopped(ChangeEvent evt) {
CellEditor editor = (CellEditor)evt.getSource();
int index = shellListView.getLastSelectedIndex();
if (index >= 0) {
try {
shellListView.getModel().renameFile(index, editor.getCellEditorValue().toString());
} catch (Exception ex) {
JOptionPane.showMessageDialog(this, bundle.getString("message.renameException.text"), bundle.getString("message.exception.title"), JOptionPane.ERROR_MESSAGE);
}
}
}
public void shellListViewMouseClicked(MouseEvent evt) {
if (evt.getClickCount() == 2) {
openViewerWindow();
}
}
public void shellListViewKeyPressed(KeyEvent evt) {
if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
openViewerWindow();
}
}
private void historyBack() {
if (historyList.size() < 1) { return; }
backOrForwardInProgress = true;
try {
historyIndex++;
if (historyIndex < historyList.size()) {
File file = new File(historyList.get(historyIndex));
if (file.exists()) {
shellListView.setCurrentDirectory(file);
shellListView.refresh();
} else {
displayErrorFileNotExists(file);
}
} else {
historyIndex = historyList.size()-1;
}
} finally {
backOrForwardInProgress = false;
}
}
private void historyForward() {
if (historyList.size() < 1) { return; }
backOrForwardInProgress = true;
try {
historyIndex--;
if (historyIndex > -1) {
File file = new File(historyList.get(historyIndex));
if (file.exists()) {
shellListView.setCurrentDirectory(file);
shellListView.refresh();
} else {
displayErrorFileNotExists(file);
}
} else {
historyIndex = 0;
}
} finally {
backOrForwardInProgress = false;
}
}
private void upActionPerformed() {
File dir = shellListView.getCurrentDirectory();
if (dir != null) {
dir = dir.getParentFile();
}
if (dir != null) {
shellListView.setCurrentDirectory(dir);
shellListView.refresh();
} else {
}
}
private void locationActionPerformed(String str) {
if (shellListViewInProgress) {
return;
}
File file = new File(str);
if (file.exists()) {
shellListView.setCurrentDirectory(file);
shellListView.refresh();
} else {
displayErrorFileNotExists(file);
}
}
@SuppressWarnings("static-access")
private void cutActionPerformed(ActionEvent evt) {
Container parent = ((Component)evt.getSource()).getParent();
Action action = null;
JComponent source = null;
if (shellTreeViewPopupMenu.equals(parent)) {
action = shellTreeView.getTransferHandler().getCutAction();
source = shellTreeView;
} else {
action = shellListView.getTransferHandler().getCutAction();
source = (JComponent)shellListView.getViewComponent();
}
ActionEvent newEvent = new ActionEvent(source,ActionEvent.ACTION_PERFORMED,evt.getActionCommand());
action.actionPerformed(newEvent);
}
@SuppressWarnings("static-access")
private void copyActionPerformed(ActionEvent evt) {
Container parent = ((Component)evt.getSource()).getParent();
Action action = null;
JComponent source = null;
if (shellTreeViewPopupMenu.equals(parent)) {
action = shellTreeView.getTransferHandler().getCopyAction();
source = shellTreeView;
} else {
action = shellListView.getTransferHandler().getCopyAction();
source = (JComponent)shellListView.getViewComponent();
}
ActionEvent newEvent = new ActionEvent(source,ActionEvent.ACTION_PERFORMED,evt.getActionCommand());
action.actionPerformed(newEvent);
}
@SuppressWarnings("static-access")
private void pasteActionPerformed(ActionEvent evt) {
Container parent = ((Component)evt.getSource()).getParent();
Action action = null;
JComponent source = null;
if (shellTreeViewPopupMenu.equals(parent)) {
action = shellTreeView.getTransferHandler().getPasteAction();
source = shellTreeView;
} else {
action = shellListView.getTransferHandler().getPasteAction();
source = (JComponent)shellListView.getViewComponent();
}
ActionEvent newEvent = new ActionEvent(source,ActionEvent.ACTION_PERFORMED,evt.getActionCommand());
action.actionPerformed(newEvent);
}
private void renameActionPerformed(ActionEvent evt) {
//System.err.println(evt.getSource().getClass().toString());
Container parent = ((Component)evt.getSource()).getParent();
if (shellTreeViewPopupMenu.equals(parent)) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode)shellTreeView.getLastSelectedPathComponent();
if (node != null) {
shellTreeView.startEditingAtPath(new TreePath(node.getPath()));
}
} else {
int i = shellListView.getLastSelectedIndex();
if ( i != -1) {
shellListView.editCellAt(i);
}
}
}
private void deleteActionPerformed(ActionEvent evt) {
final List<File> deleteList = new ArrayList<File>();
Container parent = ((Component)evt.getSource()).getParent();
if (shellTreeViewPopupMenu.equals(parent)) {
DefaultMutableTreeNode node = null;
node = (DefaultMutableTreeNode)shellTreeView.getLastSelectedPathComponent();
if (node != null) {
deleteList.add((File)node.getUserObject());
}
} else {
List<File> selectedList = shellListView.getSelectedFiles();
if (selectedList != null) {
deleteList.addAll(selectedList);
}
}
if (deleteList.size() == 0) {
return;
}
int n = JOptionPane.showConfirmDialog(this,bundle.getString("message.confirmDelete.text"),bundle.getString("message.confirmDelete.title"),JOptionPane.YES_NO_OPTION);
if (n == JOptionPane.OK_OPTION) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
shellProgressMonitor.start(ShellProgressMonitor.DELETE,deleteList,null);
} catch (Exception ex) {
JOptionPane.showMessageDialog(BrowserWindow.this, bundle.getString("message.deleteException.text"), bundle.getString("message.exception.title"), JOptionPane.ERROR_MESSAGE);
shellProgressMonitor.cancel();
}
}
});
}
}
private void shellProgressMonitorShellDeleted(ShellEvent evt) {
// handle shellTreeView
DefaultMutableTreeNode node = (DefaultMutableTreeNode)shellTreeView.getLastSelectedPathComponent();
if (node != null) {
if (node.getUserObject().equals(evt.getSourceFile())) {
ShellTreeViewModel dataModel = (ShellTreeViewModel)shellTreeView.getModel();
dataModel.removeNodeFromParent(node);
}
}
// handle shellListView
if (evt.getSourceFile().equals(shellListView.getCurrentDirectory())) {
//shellListView.refresh();
} else {
ShellListViewModel dataModel = shellListView.getModel();
int i = dataModel.indexOf(evt.getSourceFile());
if (i != -1) {
dataModel.remove(i);
}
}
}
private void shellProgressMonitorShellMoved(ShellEvent evt) {
// handle shellTreeView
DefaultMutableTreeNode node = (DefaultMutableTreeNode)shellTreeView.getLastSelectedPathComponent();
if (node != null) {
if (node.getUserObject().equals(evt.getSourceFile())) {
ShellTreeViewModel dataModel = (ShellTreeViewModel)shellTreeView.getModel();
dataModel.removeNodeFromParent(node);
}
}
// handle shellListView
/*if (evt.getSourceFile().equals(shellListView.getCurrentDirectory())) {
//shellListView.refresh();
} else {
ShellListViewModel dataModel = shellListView.getModel();
int i = dataModel.indexOf(evt.getSourceFile());
if (i != -1) {
dataModel.remove(i);
}
}*/
}
private class BrowserAction extends AbstractAction {
public BrowserAction(String actionCommand) {
putValue(Action.ACTION_COMMAND_KEY,actionCommand);
}
/** {@inheritDoc} */
public void actionPerformed(ActionEvent evt) {
String command = evt.getActionCommand();
if (command.equals(EXIT_ACTION_COMMAND)) {
exitForm();
} else if (command.equals(CUT_ACTION_COMMAND)) {
cutActionPerformed(evt);
} else if (command.equals(COPY_ACTION_COMMAND)) {
copyActionPerformed(evt);
} else if (command.equals(PASTE_ACTION_COMMAND)) {
pasteActionPerformed(evt);
} else if (command.equals(RENAME_ACTION_COMMAND)) {
renameActionPerformed(evt);
} else if (command.equals(DELETE_ACTION_COMMAND)) {
deleteActionPerformed(evt);
} else if (command.equals(PREFERENCES_ACTION_COMMAND)) {
WindowManager windowManager = WindowManager.getInstance();
windowManager.openPreferencesWindow();
} else if (command.equals(BACK_ACTION_COMMAND)) {
historyBack();
} else if (command.equals(FORWARD_ACTION_COMMAND)) {
historyForward();
} else if (command.equals(UP_ACTION_COMMAND)) {
upActionPerformed();
} else if (command.equals(HOME_ACTION_COMMAND)) {
File home = new File(System.getProperty("user.home","."));
shellTreeView.setSelection(home);
} else if (command.equals(RELOAD_ACTION_COMMAND)) {
shellListView.refresh();
} else if (command.equals(LOCATION_ACTION_COMMAND)) {
JComboBox combo = (JComboBox)evt.getSource();
String str = (String)combo.getSelectedItem();
if (str != null) {
locationActionPerformed(str);
}
} else if (command.equals(RESET_PERSPECTIVE_ACTION_COMMAND)) {
resetPerspective();
} else if (command.equals(DETAIL_VIEW_ACTION_COMMAND)) {
shellListView.setViewStyle(ShellListView.VS_DETAIL);
} else if (command.equals(LIST_VIEW_ACTION_COMMAND)) {
shellListView.setViewStyle(ShellListView.VS_LIST);
} else if (command.equals(ICON_VIEW_ACTION_COMMAND)) {
shellListView.setViewStyle(ShellListView.VS_ICON);
} else if (command.equals(THUMBNAIL_VIEW_ACTION_COMMAND)) {
shellListView.setViewStyle(ShellListView.VS_THUMBNAIL);
} else if (command.equals(PICASA_LOGIN_ACTION_COMMAND)) {
picasaLogin();
} else if (command.equals(PICASA_ADD_ACTION_COMMAND)) {
picasaAdd();
} else if (command.equals(PICASA_MANAGE_ACTION_COMMAND)) {
picasaManage();
} else if (command.equals(HELP_CONTENT_ACTION_COMMAND)) {
JOptionPane.showMessageDialog(BrowserWindow.this,"Not Implemented yet.");
System.err.println("...Help Contents: not implemented yet");
} else if (command.equals(TOTD_ACTION_COMMAND)) {
WindowManager windowManager = WindowManager.getInstance();
windowManager.openTOTDWindow();
} else if (command.equals(ABOUT_ACTION_COMMAND)) {
WindowManager windowManager = WindowManager.getInstance();
windowManager.openAboutWindow();
}
}
}
private class BrowserPerspectiveFactory implements PerspectiveFactory {
public Perspective getPerspective(String persistentId) {
//System.err.println("getPerspective:" + persistentId);
if(DEFAULT_PERSPECTIVE.equals(persistentId)) {
return createDefaultPerspective();
}
return null;
}
private Perspective createDefaultPerspective() {
//System.err.println("createDefaultPers");
Perspective perspective = new Perspective(DEFAULT_PERSPECTIVE, "Default");
LayoutSequence sequence = perspective.getInitialSequence(true);
sequence.add(DOCKING_LIST_VIEW);
sequence.add(DOCKING_TREE_VIEW, DOCKING_LIST_VIEW, DockingConstants.WEST_REGION, .3f);
sequence.add(DOCKING_PREVIEW_VIEW, DOCKING_TREE_VIEW, DockingConstants.SOUTH_REGION, .6f);
/*sequence.add(DOCKING_TREE_VIEW);
sequence.add(DOCKING_LIST_VIEW, DOCKING_TREE_VIEW, DockingConstants.EAST_REGION, .3f);
sequence.add(DOCKING_PREVIEW_VIEW, DOCKING_TREE_VIEW, DockingConstants.SOUTH_REGION, .6f);
*/
return perspective;
}
}
private class ViewFactory extends DockableFactory.Stub {
@Override
public Component getDockableComponent(String dockableId) {
//System.err.println("getDockableComponent:" + dockableId);
if (DOCKING_LIST_VIEW.equals(dockableId)) {
return createViewComponent(DOCKING_LIST_VIEW,"Folders and Files",shellListView);
} else if (DOCKING_TREE_VIEW.equals(dockableId)) {
View view = createViewComponent(DOCKING_TREE_VIEW,"Folders",new JScrollPane(shellTreeView));
view.addAction(DockingConstants.PIN_ACTION);
return view;
} else if (DOCKING_PREVIEW_VIEW.equals(dockableId)) {
View view = createViewComponent(DOCKING_PREVIEW_VIEW,"Preview",imagePreviewPane);
view.addAction(DockingConstants.PIN_ACTION);
return view;
}
return null;
}
private View createViewComponent(String id, String text, JComponent comp) {
View view = new View(id, text);
JPanel p = new JPanel();
p.setBorder(new LineBorder(Color.GRAY, 1));
p.setLayout(new BorderLayout());
p.add(comp, BorderLayout.CENTER);
view.setContentPane(p);
return view;
}
}
}