/*
* org.openmicroscopy.shoola.agents.treeviewer.view.TreeViewerWin
*
*------------------------------------------------------------------------------
* Copyright (C) 2006-2014 University of Dundee. All rights reserved.
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* This program 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 for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*------------------------------------------------------------------------------
*/
package org.openmicroscopy.shoola.agents.treeviewer.view;
//Java imports
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComponent;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JViewport;
//Third-party libraries
import org.jdesktop.swingx.JXTaskPane;
//Application-internal dependencies
import org.openmicroscopy.shoola.agents.dataBrowser.view.DataBrowser;
import org.openmicroscopy.shoola.agents.metadata.view.MetadataViewer;
import org.openmicroscopy.shoola.agents.treeviewer.TreeViewerAgent;
import org.openmicroscopy.shoola.agents.treeviewer.actions.MoveToAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.NewObjectAction;
import org.openmicroscopy.shoola.agents.treeviewer.actions.TreeViewerAction;
import org.openmicroscopy.shoola.agents.treeviewer.browser.Browser;
import org.openmicroscopy.shoola.agents.util.finder.AdvancedFinder;
import org.openmicroscopy.shoola.env.LookupNames;
import org.openmicroscopy.shoola.env.data.model.ScriptObject;
import org.openmicroscopy.shoola.env.ui.ActivityComponent;
import org.openmicroscopy.shoola.env.ui.TaskBar;
import org.openmicroscopy.shoola.env.ui.TopWindow;
import org.openmicroscopy.shoola.util.ui.JXTaskPaneContainerSingle;
import org.openmicroscopy.shoola.util.ui.UIUtilities;
import org.openmicroscopy.shoola.util.ui.tdialog.TinyDialog;
import com.google.common.collect.Lists;
/**
* The {@link TreeViewer}'s View. Embeds the different <code>Browser</code>'s UI
* to display the various visualization trees. Also provides a menu bar
* and a working pane. After creation this window will display an empty panel as
* a place holder for the working pane UI.
*
* @author Jean-Marie Burel <a
* href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk </a>
* @version 2.2 <small>( <b>Internal version: </b> $Revision$ $Date:
* 2006/01/05 16:05:46 $) </small>
* @since OME2.2
*/
class TreeViewerWin
extends TopWindow
{
/** The text of the <code>View</code> menu.*/
static final String VIEW_MENU = "View";
/** The text of the <code>Edit</code> menu.*/
static final String EDIT_MENU = "Edit";
/** The text of the <code>Edit</code> menu.*/
static final String CREATE_NEW_MENU = "Create New";
/** The text of the <code>Edit</code> menu.*/
static final String RENDERING_SETTINGS_MENU = "Rendering Settings";
/** Identifies the <code>JXTaskPane</code> layout. */
static final String JXTASKPANE_TYPE = "JXTaskPane";
/** Indicates how much to give to the Metadata View. */
private static final double WEIGHT = 0.8;
/** The default title of the window. */
private static final String TITLE = "Data Manager";
/** The Controller. */
private TreeViewerControl controller;
/** The Model. */
private TreeViewerModel model;
/**
* The split pane hosting the {@link #workingPane} and the
* {@link #tabs}.
*/
private JSplitPane splitPane;
/** The component hosting the working pane. */
private JScrollPane workingPane;
/** The component hosting the working pane. */
private JSplitPane rightPane;
/** The component displaying the browser. */
private JComponent browsersDisplay;
/**
* Collections of menu items to update when a node is selected
* or when a tab pane is selected.
*/
private List<JMenuItem> menuItems;
/** The tool bar hosting the controls displaying by the pop-up menu. */
private ToolBar toolBar;
/** The status bar. */
private StatusBar statusBar;
/** The bounds of the component invoking the component. */
private Rectangle invokerBounds;
/** Constants indicating the display mode. */
private int displayMode;
/** The scrollPane hosting the advanced finder. */
private JScrollPane finderScrollPane;
/** The component that has been removed. */
private Component leftComponent;
/** The component that has been removed. */
private Component rightComponent;
/** The location of the divider. */
private int dividerLocation;
/** Flag indicating that the tree is visible or hidden. */
private boolean treeVisible;
/** Flag indicating that the metadata view is visible or hidden. */
private boolean metadataVisible;
/** The location of the right split pane. */
private int dividerRightLocation;
/** The first selected pane. */
private JXTaskPane firstPane;
/** The first selected pane. */
private JXTaskPane searchPane;
/** The component hosting the task panes. */
private JXTaskPaneContainerSingle container;
/** The pane displaying the viewer. */
private JSplitPane viewerPane;
/** The listener to the split panes.*/
private PropertyChangeListener listener;
/**
* Checks if the specified {@link Browser} is already visible.
*
* @param browser The specified {@link Browser}.
* @return <code>true</code> if visible, <code>false</code> otherwise.
*/
private boolean isBrowserVisible(Browser browser)
{
Component[] comps = browsersDisplay.getComponents();
for (int i = 0; i < comps.length; i++) {
if (comps[i].equals(browser.getUI())) return true;
}
return false;
}
/** Creates the components hosting the browsers. */
private void layoutBrowsers()
{
Map<Integer, Browser> browsers = model.getBrowsers();
Browser browser;
if (getLayoutType().equals(JXTASKPANE_TYPE)) {
container = new JXTaskPaneContainerSingle();
container.addPropertyChangeListener(controller);
JXTaskPane pane;
final List<String> browserNames = Lists.newArrayList("project", "screen", "file", "tag");
final List<Integer> browserOrder = Lists.newArrayList(
Browser.PROJECTS_EXPLORER, Browser.SCREENS_EXPLORER, Browser.FILES_EXPLORER, Browser.TAGS_EXPLORER);
int browserIndex = browserOrder.indexOf(TreeViewerAgent.getDefaultHierarchy());
switch (Integer.signum(browserIndex)) {
case 1:
browserNames.add(0, browserNames.remove(browserIndex));
browserOrder.add(0, browserOrder.remove(browserIndex));
/* intentional fall-through */
case 0:
for (browserIndex = 0; browserIndex < browserOrder.size(); browserIndex++) {
pane = new TaskPaneBrowser(browsers.get(browserOrder.get(browserIndex)), browserNames.get(browserIndex));
if (browserIndex == 0) {
firstPane = pane;
}
container.add(pane);
}
}
//browser = (Browser) browsers.get(Browser.FILE_SYSTEM_EXPLORER);
//container.add(new TaskPaneBrowser(browser));
browser = browsers.get(Browser.IMAGES_EXPLORER);
container.add(new TaskPaneBrowser(browser, "image"));
if (model.isLeader() || model.isAdministrator()) {
browser = browsers.get(Browser.ADMIN_EXPLORER);
final TaskPaneBrowser tpb = new TaskPaneBrowser(browser, "administration");
container.add(tpb);
}
AdvancedFinder finder = model.getAdvancedFinder();
finder.addPropertyChangeListener(controller);
searchPane = new TaskPaneBrowser(new JScrollPane(finder), "search");
container.add(searchPane);
JScrollPane s = new JScrollPane(container);
s.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
browsersDisplay = s;
} else {
JTabbedPane tabs = new JTabbedPane(JTabbedPane.TOP,
JTabbedPane.WRAP_TAB_LAYOUT);
tabs.setAlignmentX(LEFT_ALIGNMENT);
Font font = (Font) TreeViewerAgent.getRegistry().lookup(
"/resources/fonts/Titles");
tabs.setFont(font);
tabs.setForeground(UIUtilities.STEELBLUE);
browser = (Browser) browsers.get(Browser.PROJECTS_EXPLORER);
if (browser.isDisplayed())
tabs.addTab(browser.getTitle(), browser.getIcon(),
browser.getUI());
browser = (Browser) browsers.get(Browser.FILES_EXPLORER);
if (browser.isDisplayed())
tabs.addTab(browser.getTitle(), browser.getIcon(),
browser.getUI());
browser = (Browser) browsers.get(Browser.TAGS_EXPLORER);
if (browser.isDisplayed())
tabs.addTab(browser.getTitle(), browser.getIcon(),
browser.getUI());
browser = (Browser) browsers.get(Browser.IMAGES_EXPLORER);
if (browser.isDisplayed())
tabs.addTab(browser.getTitle(), browser.getIcon(),
browser.getUI());
browsersDisplay = tabs;
}
}
/**
* Creates the menu bar.
*
* @return The menu bar.
*/
private JMenuBar createMenuBar()
{
TaskBar tb = TreeViewerAgent.getRegistry().getTaskBar();
List<JMenu> menus = new ArrayList<JMenu>();
menus.add(createFileMenu());
menus.add(createEditMenu());
JMenu m = createViewMenu();
if (m != null) menus.add(m);
JMenuBar bar = tb.getTaskBarMenuBar();
bar.setName("menu bar");
List<JMenu> existingMenus = new ArrayList<JMenu>();
for (int i = 0; i < bar.getMenuCount(); i++) {
if (i != TaskBar.FILE_MENU)
existingMenus.add(bar.getMenu(i));
}
bar.removeAll();
Iterator<JMenu> k = menus.iterator();
while (k.hasNext())
bar.add(k.next());
k = existingMenus.iterator();
while (k.hasNext())
bar.add(k.next());
return bar;
}
/**
* Creates the <code>New</code> menu.
*
* @return See above.
*/
private JMenu createNewMenu()
{
JMenu menu = new JMenu(NewObjectAction.NAME);
TreeViewerAction a = controller.getAction(
TreeViewerControl.CREATE_TOP_PROJECT);
JMenuItem item = new JMenuItem(a);
menu.add(item);
item.setText(a.getActionName());
a = controller.getAction(TreeViewerControl.CREATE_TOP_DATASET);
item = new JMenuItem(a);
item.setText(a.getActionName());
menu.add(item);
menu.add(new JSeparator());
a = controller.getAction(TreeViewerControl.CREATE_TOP_SCREEN);
item = new JMenuItem(a);
item.setText(a.getActionName());
menu.add(item);
menu.add(new JSeparator());
a = controller.getAction(TreeViewerControl.CREATE_TOP_TAG_SET);
item = new JMenuItem(a);
item.setText(a.getActionName());
menu.add(item);
a = controller.getAction(TreeViewerControl.CREATE_TOP_TAG);
item = new JMenuItem(a);
item.setText(a.getActionName());
menu.add(item);
return menu;
}
/**
* Helper method to create the Views menu.
*
* @return The Views menu.
*/
private JMenu createViewMenu()
{
if (getLayoutType().equals(JXTASKPANE_TYPE)) return null;
JMenu menu = new JMenu("View");
menu.setMnemonic(KeyEvent.VK_V);
JCheckBoxMenuItem item = new JCheckBoxMenuItem();
Map<Integer, Browser> browsers = model.getBrowsers();
Browser browser = browsers.get(Browser.PROJECTS_EXPLORER);
item.setSelected(browser.isDisplayed());
item.setAction(controller.getAction(
TreeViewerControl.HIERARCHY_EXPLORER));
menu.add(item);
item = new JCheckBoxMenuItem();
browser = browsers.get(Browser.FILES_EXPLORER);
item.setSelected(browser.isDisplayed());
item.setAction(
controller.getAction(TreeViewerControl.FILES_EXPLORER));
menu.add(item);
item = new JCheckBoxMenuItem();
browser = browsers.get(Browser.TAGS_EXPLORER);
item.setSelected(browser.isDisplayed());
item.setAction(
controller.getAction(TreeViewerControl.TAGS_EXPLORER));
menu.add(item);
item = new JCheckBoxMenuItem();
browser = browsers.get(Browser.IMAGES_EXPLORER);
item.setSelected(browser.isDisplayed());
item.setAction(
controller.getAction(TreeViewerControl.IMAGES_EXPLORER));
menu.add(item);
return menu;
}
/**
* Helper method to create the <code>File</code> menu.
*
* @return See above.
*/
private JMenu createFileMenu()
{
TaskBar tb = TreeViewerAgent.getRegistry().getTaskBar();
JMenu menu = tb.getMenu(TaskBar.FILE_MENU);
Component[] comps = menu.getPopupMenu().getComponents();
menu.removeAll();
menu.add(createNewMenu());
if (comps != null) {
for (int i = 0; i < comps.length; i++) {
menu.add(comps[i]);
}
}
menu.add(new JSeparator(JSeparator.HORIZONTAL));
TreeViewerAction a = controller.getAction(TreeViewerControl.BROWSE);
JMenuItem item = new JMenuItem(a);
item.setText(a.getActionName());
menuItems.add(item);
menu.add(item);
JMenu viewMenu;
switch (TreeViewerAgent.runAsPlugin()) {
case LookupNames.IMAGE_J:
case LookupNames.IMAGE_J_IMPORT:
a = controller.getAction(TreeViewerControl.VIEW);
item = new JMenuItem(a);
item.setText(a.getActionName());
viewMenu = new JMenu(TreeViewerWin.VIEW_MENU);
viewMenu.setIcon(item.getIcon());
viewMenu.add(item);
menuItems.add(item);
a = controller.getAction(TreeViewerControl.VIEW_IN_IJ);
item = new JMenuItem(a);
item.setText(a.getActionName());
viewMenu.add(item);
menuItems.add(item);
menu.add(viewMenu);
break;
case LookupNames.KNIME:
a = controller.getAction(TreeViewerControl.VIEW);
item = new JMenuItem(a);
item.setText(a.getActionName());
viewMenu = new JMenu(TreeViewerWin.VIEW_MENU);
viewMenu.setIcon(item.getIcon());
viewMenu.add(item);
menuItems.add(item);
a = controller.getAction(TreeViewerControl.VIEW_IN_KNIME);
item = new JMenuItem(a);
item.setText(a.getActionName());
viewMenu.add(item);
menuItems.add(item);
menu.add(viewMenu);
break;
default:
a = controller.getAction(TreeViewerControl.VIEW);
item = new JMenuItem(a);
item.setText(a.getActionName());
menuItems.add(item);
menu.add(item);
}
a = controller.getAction(TreeViewerControl.REFRESH_TREE);
item = new JMenuItem(a);
item.setText(a.getActionName());
menu.add(item);
menu.add(new JSeparator(JSeparator.HORIZONTAL));
menu.add(new JMenuItem(
controller.getAction(TreeViewerControl.LOG_OFF)));
menu.add(new JMenuItem(
controller.getAction(TreeViewerControl.EXIT)));
return menu;
}
/**
* Helper method to create the <code>Edit</code> menu.
*
* @return See above.
*/
private JMenu createEditMenu()
{
JMenu menu = new JMenu("Edit");
menu.setMnemonic(KeyEvent.VK_E);
menu.add(new JMenuItem(
controller.getAction(TreeViewerControl.CUT_OBJECT)));
menu.add(new JMenuItem(
controller.getAction(TreeViewerControl.COPY_OBJECT)));
menu.add(new JMenuItem(
controller.getAction(TreeViewerControl.PASTE_OBJECT)));
menu.add(new JMenuItem(
controller.getAction(TreeViewerControl.DELETE_OBJECT)));
JMenu move = createMoveToMenu();
if (move != null)
menu.add(move);
return menu;
}
/**
* Creates a menu if the various groups the data can be moved to.
*
* @return See above.
*/
private JMenu createMoveToMenu()
{
List<MoveToAction> actions = controller.getMoveAction();
if (actions == null || actions.size() <= 1) return null;
JMenu menu = new JMenu(MoveToAction.NAME);
Iterator<MoveToAction> i = actions.iterator();
while (i.hasNext()) {
menu.add(new JMenuItem(i.next()));
}
return menu;
}
/** Initializes the UI components. */
private void initComponents()
{
layoutBrowsers();
workingPane = new JScrollPane();
workingPane.setBackground(UIUtilities.BACKGROUND_COLOR);
workingPane.getViewport().setBackground(UIUtilities.BACKGROUND_COLOR);
viewerPane = new JSplitPane();
viewerPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
viewerPane.setOneTouchExpandable(true);
viewerPane.setContinuousLayout(true);
viewerPane.setBackground(UIUtilities.BACKGROUND_COLOR);
//viewerPane.setResizeWeight(1.0);
listener = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
String name = evt.getPropertyName();
if (JSplitPane.DIVIDER_LOCATION_PROPERTY.equals(name)) {
if (evt.getSource() == rightPane && metadataVisible)
dividerRightLocation = rightPane.getDividerLocation();
handleDividerMoved();
}
}
};
}
/** Handles the change of location of the divider of the split panes.*/
private void handleDividerMoved()
{
DataBrowser db = model.getDataViewer();
JViewport viewPort = workingPane.getViewport();
JComponent component;
if (db != null) {
component = db.getBrowser().getUI();
component.setPreferredSize(viewPort.getExtentSize());
component.setSize(viewPort.getExtentSize());
component.validate();
component.repaint();
db.layoutDisplay();
}
MetadataViewer mv = model.getMetadataViewer();
if (mv != null && metadataVisible) {
component = mv.getEditorUI();
Dimension d = rightPane.getSize();
Dimension dd = viewPort.getExtentSize();
Dimension nd = new Dimension(Math.abs(d.width-dd.width), d.height);
component.setSize(nd);
component.validate();
component.repaint();
}
}
/** Builds and lays out the GUI. */
private void buildGUI()
{
treeVisible = true;
metadataVisible = true;
rightPane = new JSplitPane();
rightPane.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
rightPane.setOneTouchExpandable(true);
rightPane.setContinuousLayout(true);
rightPane.setBackground(UIUtilities.BACKGROUND_COLOR);
rightPane.setLeftComponent(workingPane);
rightPane.setRightComponent(null);
rightPane.setResizeWeight(WEIGHT);
splitPane = new JSplitPane();
//splitPane.setResizeWeight(1);
splitPane.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
splitPane.setOneTouchExpandable(true);
splitPane.setContinuousLayout(true);
splitPane.setLeftComponent(browsersDisplay);
//splitPane.setRightComponent(workingPane);
splitPane.setRightComponent(rightPane);
splitPane.setResizeWeight(0);
Container c = getContentPane();
c.setLayout(new BorderLayout(0, 0));
c.add(toolBar, BorderLayout.NORTH);
c.add(splitPane, BorderLayout.CENTER);
c.add(statusBar, BorderLayout.SOUTH);
}
/**
* Creates a new instance. The
* {@link #initialize(TreeViewerControl, TreeViewerModel) initialize}
* method should be called straight after to link this View to the
* Controller.
*/
TreeViewerWin()
{
super(TITLE);
menuItems = new ArrayList<JMenuItem>();
}
/**
* Links this View to its Controller.
*
* @param controller The Controller.
* @param model The Model.
* @param bounds The bounds of the component invoking a new
* {@link TreeViewer}.
*/
void initialize(TreeViewerControl controller, TreeViewerModel model,
Rectangle bounds)
{
this.controller = controller;
invokerBounds = bounds;
this.model = model;
displayMode = TreeViewer.EXPLORER_MODE;
statusBar = new StatusBar(controller);
statusBar.addPropertyChangeListener(controller);
toolBar = new ToolBar(controller, model, this);
initComponents();
setJMenuBar(createMenuBar());
buildGUI();
controller.attachUIListeners(browsersDisplay);
createTitle();
setName("tree viewer window");
}
/** Creates and displays the title of the window. */
void createTitle()
{
String title = model.getExperimenterNames()+" connected to ";
title += model.getHostname();
setTitle(title);
}
/** Expands the first pane. */
void selectFirstPane()
{
if (TreeViewerWin.JXTASKPANE_TYPE.equals(getLayoutType())) {
if (firstPane != null)
firstPane.setCollapsed(false);
}
}
/** Adds the metadata editor. */
void initializeDisplay()
{
if (rightComponent == null) {
rightComponent = model.getMetadataViewer().getEditorUI();
}
if (metadataVisible) {
Component[] components = rightPane.getComponents();
boolean b = false;
for (int i = 0; i < components.length; i++) {
if (components[i] == rightComponent) {
b = true;
}
}
if (!b) rightPane.setRightComponent(rightComponent);
}
}
/**
* Selects the pane corresponding to the passed index.
*
* @param browserType The type of browser hosted by the pane.
*/
void selectPane(int browserType)
{
if (TreeViewerWin.JXTASKPANE_TYPE.equals(getLayoutType())) {
List<JXTaskPane> list = container.getTaskPanes();
TaskPaneBrowser p;
Browser b;
container.removePropertyChangeListener(controller);
for (JXTaskPane pane: list) {
if (pane instanceof TaskPaneBrowser) {
p = (TaskPaneBrowser) pane;
b = p.getBrowser();
if (b != null && b.getBrowserType() == browserType) {
p.setCollapsed(false);
}
}
}
container.addPropertyChangeListener(controller);
} else {
}
}
/**
* Shows the search panel
*/
void selectSearchPane() {
searchPane.setCollapsed(false);
}
/**
* Returns the type of layout of the browser.
*
* @return See above.
*/
String getLayoutType()
{
String type = (String)
TreeViewerAgent.getRegistry().lookup("BrowserLayout");
if (type == null) type = "";
return type;
}
/** Closes and disposes of the window. */
void closeViewer()
{
setVisible(false);
dispose();
}
/**
* Adds the {@link Browser} corresponding the specified type to the display.
* If the {@link Browser} is already visible, nothing happened.
*
* @param browser The browser to add.
*/
void addBrowser(Browser browser)
{
if (browsersDisplay instanceof JTabbedPane) {
JTabbedPane tabs = (JTabbedPane) browsersDisplay;
if (!(isBrowserVisible(browser)))
tabs.addTab(browser.getTitle(), browser.getIcon(),
browser.getUI());
tabs.removeChangeListener(controller.getTabbedListener());
tabs.setSelectedComponent(browser.getUI());
tabs.addChangeListener(controller.getTabbedListener());
}
}
/**
* Removes the specified {@link Browser} from the display.
*
* @param browser The {@link Browser} to remove.
*/
void removeBrowser(Browser browser)
{
if (browsersDisplay instanceof JTabbedPane) {
JTabbedPane tabs = (JTabbedPane) browsersDisplay;
if (isBrowserVisible(browser)) {
tabs.remove(browser.getUI());
Component c = tabs.getSelectedComponent();
if (c == null) {
model.setSelectedBrowser(null);
return;
}
Map<Integer, Browser> browsers = model.getBrowsers();
Iterator<Browser> i = browsers.values().iterator();
boolean selected = false;
while (i.hasNext()) {
browser = i.next();
if (c.equals(browser.getUI())) {
model.setSelectedBrowser(browser);
selected = true;
break;
}
}
if (!selected) model.setSelectedBrowser(null);
}
}
}
/**
* Brings up the pop-up menu on top of the specified component at the
* specified point.
*
* @param index The index of the menu. One of the following constants:
* {@link TreeViewer#FULL_POP_UP_MENU} or
* {@link TreeViewer#PARTIAL_POP_UP_MENU}
* @param c The component that requested the pop-up menu.
* @param p The point at which to display the menu, relative to the
* <code>component</code>'s coordinates.
*
*/
void showPopup(int index, Component c, Point p)
{
if (c == null) return;
if (p == null) p = new Point(0, 0);
switch (index) {
case TreeViewer.FULL_POP_UP_MENU:
case TreeViewer.PARTIAL_POP_UP_MENU:
case TreeViewer.ADMIN_MENU:
case TreeViewer.VIEW_MENU:
PopupMenu popupMenu = new PopupMenu(controller, model, index);
popupMenu.show(c, p.x, p.y);
}
}
/**
* Adds the specified component to the {@link #workingPane}.
*
* @param component The component to add.
*/
void addComponent(JComponent component)
{
if (component == null) return;
rightPane.removePropertyChangeListener(listener);
splitPane.removePropertyChangeListener(listener);
JViewport viewPort = workingPane.getViewport();
component.setPreferredSize(viewPort.getExtentSize());
viewPort.removeAll();
viewPort.add(component);
viewPort.validate();
rightPane.addPropertyChangeListener(listener);
splitPane.addPropertyChangeListener(listener);
}
/**
* Displays the passed viewer in the working area.
*
* @param viewer The viewer to display.
* @param controls Reference to the controls.
* @param toAdd Pass <code>true</code> to add the component,
* <code>false</code> otherwise.
* @param toDetach Pass <code>true</code> to detach the viewer,
* <code>false</code> otherwise.
*/
void displayViewer(JComponent viewer, JComponent controls, boolean toAdd,
boolean toDetach)
{
JViewport viewPort = workingPane.getViewport();
viewPort.removeAll();
viewerPane.removeAll();
if (toAdd) {
if (model.isFullScreen()) return;
addComponent(viewer);
DataBrowser db = model.getDataViewer();
int location = splitPane.getDividerLocation();
splitPane.removeAll();
splitPane.setLeftComponent(browsersDisplay);
if (db != null) {
viewerPane.setTopComponent(viewer);
viewerPane.setBottomComponent(db.getUI(false));
viewerPane.setResizeWeight(WEIGHT);
splitPane.setRightComponent(viewerPane);
} else splitPane.setRightComponent(rightPane);
splitPane.setDividerLocation(location);
} else {
/*
if (toDetach) {
//open the viewer in a separate view.
DataBrowser db = model.getDataViewer();
if (db != null)
viewerPane.setBottomComponent(db.getUI(false));
viewerPane.setResizeWeight(WEIGHT);
} else {
model.setFullScreen(false);
toolBar.setFullScreenSelected(true);
int location = splitPane.getDividerLocation();
splitPane.removeAll();
splitPane.setLeftComponent(browsersDisplay);
splitPane.setRightComponent(rightPane);
splitPane.setDividerLocation(location);
}
*/
}
}
/**
* Displays the data browser.
*
* @param db The data browser.
*/
void displayBrowser(DataBrowser db)
{
if (db == null) return;
if (model.isFullScreen()) {
addComponent(db.getUI(model.isFullScreen()));
} else {
viewerPane.removeAll();
viewerPane.setBottomComponent(db.getUI(false));
}
}
/** Removes all the components from the {@link #workingPane}. */
void removeAllFromWorkingPane()
{
JViewport viewPort = workingPane.getViewport();
viewPort.removeAll();
viewPort.validate();
viewPort.repaint();
}
/** Clears the menus. */
void clearMenus() { toolBar.clearMenus(); }
/**
* Shows or hides the component depending on the stated of the frame.
*
* @param b Passed <code>true</code> to show the component,
* <code>false</code> otherwise.
*/
void showFinder(boolean b)
{
JSplitPane pane = null;
if (b) { //finder visible.
pane = new JSplitPane();
pane.setOrientation(JSplitPane.VERTICAL_SPLIT);
pane.setResizeWeight(1);
pane.setOneTouchExpandable(true);
pane.setContinuousLayout(true);
pane.setTopComponent(splitPane);
pane.setBottomComponent(model.getFinder());
} else pane = splitPane;
Container c = getContentPane();
c.removeAll();
c.add(toolBar, BorderLayout.NORTH);
c.add(pane, BorderLayout.CENTER);
c.add(statusBar, BorderLayout.SOUTH);
c.validate();
}
/** Displays or hides the search component. */
void showAdvancedFinder()
{
if (!getLayoutType().equals(JXTASKPANE_TYPE)) {
if (displayMode == TreeViewer.SEARCH_MODE)
displayMode = TreeViewer.EXPLORER_MODE;
else if (displayMode == TreeViewer.EXPLORER_MODE)
displayMode = TreeViewer.SEARCH_MODE;
splitPane.setDividerLocation(splitPane.getDividerLocation());
if (finderScrollPane == null) {
AdvancedFinder finder = model.getAdvancedFinder();
finder.addPropertyChangeListener(controller);
finderScrollPane = new JScrollPane(finder);
}
switch (displayMode) {
case TreeViewer.SEARCH_MODE:
splitPane.remove(browsersDisplay);
splitPane.setLeftComponent(finderScrollPane);
break;
case TreeViewer.EXPLORER_MODE:
splitPane.remove(finderScrollPane);
splitPane.setLeftComponent(browsersDisplay);
break;
}
} else {
if (displayMode == TreeViewer.SEARCH_MODE)
displayMode = TreeViewer.EXPLORER_MODE;
else if (displayMode == TreeViewer.EXPLORER_MODE)
displayMode = TreeViewer.SEARCH_MODE;
}
}
/**
* Returns the {@link #displayMode}.
*
* @return See above.
*/
int getDisplayMode() { return displayMode; }
/**
* Brings up the menu on top of the specified component at
* the specified location.
*
* @param menuID The id of the menu.
* @param c The component that requested the pop-up menu.
* @param p The point at which to display the menu, relative to the
* <code>component</code>'s coordinates.
*/
void showMenu(int menuID, Component c, Point p)
{
switch (menuID) {
case TreeViewer.MANAGER_MENU:
toolBar.showManagementMenu(c, p);
break;
case TreeViewer.CREATE_MENU_CONTAINERS:
case TreeViewer.CREATE_MENU_SCREENS:
case TreeViewer.CREATE_MENU_TAGS:
case TreeViewer.CREATE_MENU_ADMIN:
case TreeViewer.VIEW_MENU:
toolBar.showCreateMenu(c, p, menuID);
break;
case TreeViewer.PERSONAL_MENU:
toolBar.showPersonalMenu(c, p);
break;
case TreeViewer.AVAILABLE_SCRIPTS_MENU:
toolBar.showAvailableScriptsMenu(c, p);
}
}
/**
* Enables the tab pane depending on the specified parameter.
*
* @param b Pass <code>true</code> to enable the tab pane,
* <code>false</code> otherwise.
*/
void onStateChanged(boolean b)
{
Map<Integer, Browser> browsers = model.getBrowsers();
if (browsers != null) {
for (final Browser browser : browsers.values()) {
browser.onComponentStateChange(b);
}
}
//if (browser != null) browser.onComponentStateChange(b);
if (container != null) container.setExpandable(b);
browsersDisplay.setEnabled(b);
}
/**
* Sets the status message.
*
* @param text The message to display.
* @param hide Pass <code>true</code> to hide the progress bar,
* <code>false</otherwise>.
*/
void setStatus(String text, boolean hide)
{
statusBar.setStatus(text);
statusBar.setProgress(hide);
}
/**
* Sets the icon depending on the passed flag.
*
* @param b Pass <code>true</code> when loading data, <code>false</code>
* otherwise.
*/
void setStatusIcon(boolean b)
{
if (b) setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
else setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
statusBar.setStatusIcon(b);
}
/**
* Updates the text of the menu items when a node is selected
* or when a tab pane is selected.
*/
void updateMenuItems()
{
Iterator<JMenuItem> i = menuItems.iterator();
JMenuItem item;
TreeViewerAction a;
while (i.hasNext()) {
item = i.next();
a = (TreeViewerAction) item.getAction();
item.setText(a.getActionName());
item.setToolTipText(a.getActionDescription());
}
toolBar.setPermissions();
}
/** Shows or hides the Tree Viewer. */
void setInspectorVisibility()
{
if (treeVisible) {
if (leftComponent == null)
leftComponent = splitPane.getLeftComponent();
dividerLocation = splitPane.getDividerLocation();
Component[] components = splitPane.getComponents();
if (components != null) {
boolean b = false;
for (int i = 0; i < components.length; i++) {
if (components[i] == leftComponent)
b = true;
}
if (b && leftComponent != null)
splitPane.remove(leftComponent);
}
} else {
if (leftComponent != null) {
splitPane.add(leftComponent);
splitPane.setDividerLocation(dividerLocation);
}
}
treeVisible = !treeVisible;
}
/** Shows or hides the Tree Viewer. */
void setMetadataVisibility()
{
if (rightComponent == null) {
rightComponent = model.getMetadataViewer().getEditorUI();
}
if (metadataVisible) {
Component[] components = rightPane.getComponents();
if (components != null && components.length > 0) {
boolean b = false;
for (int i = 0; i < components.length; i++) {
if (components[i] == rightComponent)
b = true;
}
if (b) {
rightPane.remove(rightComponent);
}
}
} else {
if (rightComponent != null) {
rightPane.add(rightComponent);
if (dividerRightLocation > 0)
rightPane.setDividerLocation(dividerRightLocation);
else rightPane.setResizeWeight(WEIGHT);
}
}
metadataVisible = !metadataVisible;
}
/**
* Resets the metadata viewer.
*
* @return See above.
*/
MetadataViewer resetMetadataViewer()
{
MetadataViewer v = model.resetMetadataViewer();
v.addPropertyChangeListener(controller);
if (rightComponent != null) rightPane.remove(rightComponent);
rightComponent = v.getEditorUI();
if (metadataVisible) {
rightPane.add(rightComponent);
if (dividerRightLocation > 0)
rightPane.setDividerLocation(dividerRightLocation);
else rightPane.setResizeWeight(WEIGHT);
}
return v;
}
/**
* Makes sure that the metadata view is visible
*/
void forceShowMetaDataView() {
metadataVisible = true;
resetMetadataViewer();
}
/**
* Reloads the specified thumbnails.
*
* @param ids The collection of images' ids to reload.
*/
void reloadThumbnails(List<Long> ids)
{
model.reloadThumbnails(ids);
}
/**
* Indicates that an activity has just terminated.
*
* @param activity The activity to handle.
*/
void onActivityTerminated(ActivityComponent activity)
{
TinyDialog d = new TinyDialog(this, activity.getActivityType(),
TinyDialog.CLOSE_ONLY);
d.getContentPane().setBackground(UIUtilities.BACKGROUND_COLOUR_EVEN);
d.addPropertyChangeListener(TinyDialog.CLOSED_PROPERTY,
controller);
d.pack();
Point p = new Point(0, 2*statusBar.getPreferredSize().height);
setCloseAfter(true);
showJDialogAsSheet(d, p, UP_RIGHT);
}
/** Refreshes the renderer. */
void refreshRenderer() { model.refreshRenderer(); }
/**
* Returns the MIME type
*
* @return See above.
*/
String getObjectMimeType() { return model.getObjectMimeType(); }
/**
* Returns the script corresponding to the specified name.
*
* @param value The name of the script.
* @return See above
*/
ScriptObject getScriptFromName(String name)
{
return model.getScriptFromName(name);
}
/**
* Invokes when loadings scripts.
*
* @param loading Passes <code>true</code> if there is an on-going loading.
* <code>false</code> otherwise.
*/
void setScriptsLoadingStatus(boolean loading)
{
toolBar.setScriptsLoadingStatus(loading);
}
/** Indicates the group context.*/
void setPermissions() { toolBar.setPermissions(); }
/**
* Resets the layout and returns the newly selected browser or
* <code>null</code> if no new browser selected.
*
* @return See above
*/
Browser resetLayout()
{
layoutBrowsers();
splitPane.setLeftComponent(browsersDisplay);
Browser result = null;
if (TreeViewerWin.JXTASKPANE_TYPE.equals(getLayoutType())) {
//if (firstPane != null) firstPane.setCollapsed(false);
Browser browser = model.getSelectedBrowser();
Browser b;
List<JXTaskPane> list = container.getTaskPanes();
TaskPaneBrowser tpb;
container.removePropertyChangeListener(controller);
if (browser != null) {
if (browser.getBrowserType() == Browser.ADMIN_EXPLORER) {
if (TreeViewerAgent.isAdministrator()) {
for (JXTaskPane pane: list) {
if (pane instanceof TaskPaneBrowser) {
tpb = (TaskPaneBrowser) pane;
b = tpb.getBrowser();
if (b == browser) {
tpb.setCollapsed(false);
}
}
}
} else {
if (firstPane != null) {
result = ((TaskPaneBrowser) firstPane).getBrowser();
firstPane.setCollapsed(false);
}
}
} else {
for (JXTaskPane pane: list) {
if (pane instanceof TaskPaneBrowser) {
tpb = (TaskPaneBrowser) pane;
b = tpb.getBrowser();
if (b == browser) {
tpb.setCollapsed(false);
}
}
}
}
} else { //that's the search.
if (searchPane != null) searchPane.setCollapsed(false);
}
container.addPropertyChangeListener(controller);
}
validate();
repaint();
return result;
}
/** Invokes when import is going on or finished.*/
void onImport() { toolBar.onImport(); }
/** Overrides the {@link #setOnScreen() setOnScreen} method. */
@Override
public void setOnScreen()
{
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setSize(9*(screenSize.width/10), 8*(screenSize.height/10));
UIUtilities.incrementRelativeToAndShow(invokerBounds, this);
invokerBounds = null;
}
}