Client.java :  » Workflow-Engines » osbl-1_0 » org » osbl » client » wings » shell » Java Open Source

Java Open Source » Workflow Engines » osbl 1_0 
osbl 1_0 » org » osbl » client » wings » shell » Client.java
package org.osbl.client.wings.shell;

import java.util.*;

import org.conform.BeanMetaProvider;
import org.osbl.client.action.ActionProvider;
import org.osbl.client.ClientResourceProvider;
import org.osbl.client.ClientServiceProvider;
import org.osbl.client.wings.devtools.DevelopmentTool;
import org.wings.*;
import org.wings.session.*;

import javax.swing.*;
import javax.swing.event.*;

/**
 * @author hengels
 * @version $Revision$
 */
public abstract class Client
{
    private BeanMetaProvider beanMetaProvider;
    private ActionProvider actionProvider;
    private ClientServiceProvider serviceProvider;
    private ClientResourceProvider resourceProvider;
    private static List<ClientInitializer> initializers = new LinkedList<ClientInitializer>();
    protected DevelopmentTool developmentTool;
    protected ContextHelpTool contextHelpTool;

    protected Client() {
        getSession().setProperty("Client", this);

        for (Iterator<ClientInitializer> iterator = initializers.iterator(); iterator.hasNext();) {
            ClientInitializer clientInitializer = iterator.next();
            clientInitializer.preInitialization(this);
        }

        initialize();

        for (Iterator<ClientInitializer> iterator = initializers.iterator(); iterator.hasNext();) {
            ClientInitializer clientInitializer = iterator.next();
            clientInitializer.postInitialization(this);
        }

        new URLNavigation();
    }

    protected abstract void initialize();

    public static void addInitializer(ClientInitializer clientInitializer) {
        initializers.add(clientInitializer);
    }

    public static Client getInstance() {
        return (Client)SessionManager.getSession().getProperty("Client");
    }

    public BeanMetaProvider getBeanMetaProvider() {
        return beanMetaProvider;
    }

    public void setBeanMetaProvider(BeanMetaProvider beanMetaProvider) {
        this.beanMetaProvider = beanMetaProvider;
    }

    public ActionProvider getActionProvider() {
        return actionProvider;
    }

    public void setActionProvider(ActionProvider actionProvider) {
        this.actionProvider = actionProvider;
    }

    public ClientServiceProvider getServiceProvider() {
        return serviceProvider;
    }

    public void setServiceProvider(ClientServiceProvider serviceProvider) {
        this.serviceProvider = serviceProvider;
    }

    public ClientResourceProvider getResourceProvider() {
        return resourceProvider;
    }

    public void setResourceProvider(ClientResourceProvider resourceProvider) {
        this.resourceProvider = resourceProvider;
    }

    protected Session getSession() {
        return SessionManager.getSession();
    }

    public abstract void addNavigation(String character, String title, SIcon icon, SComponent component);
    public abstract void removeNavigation(String character);
    public abstract void removeNavigation(SComponent component);
    public abstract SComponent getNavigation(String character);
    public abstract void clearNavigations();

    @Deprecated
    public abstract void show(String character, SComponent component);
    @Deprecated
    public abstract void hide(String character, SComponent component);
    @Deprecated
    public abstract void showMessage(Message message);
    @Deprecated
    public abstract void hideMessage(Message message);
    @Deprecated
    public abstract void clearMessages();
    @Deprecated
    public abstract void refreshTitle();
    @Deprecated
    public abstract void refreshActions();
    @Deprecated
    public abstract void refreshTools();

    protected boolean isIE() {
        System.out.println("getSession().getUserAgent() = " + getSession().getUserAgent());
        return BrowserType.IE.equals(getSession().getUserAgent().getBrowserType());
    }

    public abstract void showDetailHelp(String key);

    public abstract SComponent getShownComponent();

    public abstract void addHeaderComponent(SComponent component);

    public void addHeaderButton(Action action) {
        if (action != null && action.isEnabled()) {
            SButton button = new SButton(action);
            button.setToolTipText(button.getText());
            button.setText(null);
            button.setStyle("borderless_form");
            addHeaderComponent(button);
        }
    }

    public void setDevelopmentTool(DevelopmentTool developmentTool) {
        this.developmentTool = developmentTool;
    }

    public void setContextHelpTool(ContextHelpTool contextHelpTool) {
        this.contextHelpTool = contextHelpTool;
    }

    private WindowStacksModel windowStacksModel = new WindowStacksModel();
    {
        windowStacksModel.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                int i = windowStacksModel.getActiveStack();
                activateStack(i != -1 ? windowStacksModel.getElementAt(i) : null);
            }
        });
    }

    public WindowStacksModel getWindowStacksModel() {
        return windowStacksModel;
    }

    public void pushWindow(Window window) {
        if (!activateStack(window))
            pushWindow(null, window);
    }

    public void pushWindow(Window parent, Window window) {
        if (parent != null) {
            window.setParent(parent);

            for (Stack<Window> stack : windowStacksModel) {
                if (stack.contains(parent)) {
                    stack.peek().setVisible(false);

                    stack.push(window);
                    window.setVisible(true);
                    window.setActive(windowStacksModel.getStacks().indexOf(stack) == windowStacksModel.getActiveStack());

                    break;
                }
            }
        }
        else {
            Stack<Window> stack = new Stack<Window>();
            windowStacksModel.add(stack);
            windowStacksModel.setActiveStack(windowStacksModel.getSize() - 1);

            stack.push(window);
            window.setVisible(true);
            window.setActive(true);
        }
    }

    public void popWindow(Window window) {
        for (Stack<Window> stack : windowStacksModel) {
            if (stack.peek() == window) {
                window.setActive(false);
                window.setVisible(false);
                stack.pop();
                if (stack.size() > 0)
                    stack.peek().setVisible(true);
                else {
                    windowStacksModel.remove(stack);
                }
                return;
            }
        }
        throw new IllegalArgumentException("Can't pop this window. It is not lying on top of any window stack!");
    }

    public boolean activateStack(Window window) {
        int i=0;
        for (Stack<Window> stack : windowStacksModel) {
            if (stack.contains(window)) {
                activateStack(stack);
                windowStacksModel.setActiveStack(i);
                return true;
            }
            i++;
        }
        return false;
    }

    Stack<Window> activeStack = null;

    private void activateStack(Stack<Window> activeStack) {
        if (this.activeStack == activeStack)
            return;

        if (this.activeStack != null)
            for (Window window : this.activeStack)
                window.setActive(false);

        this.activeStack = activeStack;

        if (this.activeStack != null)
            for (Window window : this.activeStack)
                window.setActive(true);
        else {
            setTitle(null);
            setContent(null);
            setStatusMessage(null);
            setControls(null);
            setTools(null);
            setDevelopmentActions(null);
            setDefaultButton(null);
        }
    }

    protected abstract void setContent(SComponent contentPane);
    protected void setTitle(String title) {
        if (windowStacksModel.getActiveStack() != -1)
            windowStacksModel.changed(windowStacksModel.getActiveStack());
    }
    protected abstract void setControls(List<SComponent> controls);
    protected abstract void setTools(List<Tool> tools);
    protected abstract void setStatusMessage(Message statusMessage);
    protected abstract void setDevelopmentActions(List<Action> developmentActions);
    protected abstract void setHelpCode(String helpCode);
    protected abstract void setDefaultButton(SButton button);

    protected abstract Window currentWindow(SComponent component);

    public Locale getLocale() {
        return getSession().getLocale();
    }

    public static class Message {
        public static final int TYPE_INFO = javax.swing.JOptionPane.INFORMATION_MESSAGE;
        public static final int TYPE_WARNING = javax.swing.JOptionPane.WARNING_MESSAGE;
        public static final int TYPE_ERROR = javax.swing.JOptionPane.ERROR_MESSAGE;

        private int type;
        private String message;
        private String detail;

        public Message() {
        }

        public Message(int type, String message, String detail) {
            if (type < 0 || type > 2)
                throw new IllegalArgumentException("Illegal type");
            this.type = type;
            this.message = message;
            this.detail = detail;
        }

        public Message(int type, String message) {
            if (type < 0 || type > 2)
                throw new IllegalArgumentException("Illegal type");
            this.type = type;
            this.message = message;
        }

        public int getType() {
            return type;
        }

        public void setType(int type) {
            this.type = type;
        }

        public String getMessage() {
            return message;
        }

        public void setMessage(String message) {
            this.message = message;
        }

        public String getDetail() {
            return detail;
        }

        public void setDetail(String detail) {
            this.detail = detail;
        }

        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;

            Message message1 = (Message)o;

            if (type != message1.type) return false;
            if (detail != null ? !detail.equals(message1.detail) : message1.detail != null) return false;
            if (message != null ? !message.equals(message1.message) : message1.message != null) return false;

            return true;
        }

        public int hashCode() {
            int result;
            result = type;
            result = 31 * result + (message != null ? message.hashCode() : 0);
            result = 31 * result + (detail != null ? detail.hashCode() : 0);
            return result;
        }

        public String toString() {
            switch (type) {
                case TYPE_INFO:
                    return "[I] " + message;
                case TYPE_WARNING:
                    return "[W] " + message;
                case TYPE_ERROR:
                    return "[E] " + message;
                default:
                    return message;
            }
        }
    }

    protected class WindowStacksModel
        extends AbstractListModel
        implements Iterable<Stack<Window>>
    {
        private List<Stack<Window>> stacks = new ArrayList<Stack<Window>>();
        private int activeStack;

        private EventListenerList listeners = new EventListenerList();
        private ChangeEvent changeEvent = new ChangeEvent(this);

        public List<Stack<Window>> getStacks() {
            return stacks;
        }

        public int getSize() {
            return stacks.size();
        }

        public Stack<Window> getElementAt(int index) {
            return stacks.get(index);
        }

        public void changed(int activeStack) {
            fireContentsChanged(this, activeStack, activeStack);
        }

        public int getActiveStack() {
            return activeStack;
        }

        public void setActiveStack(int activeStack) {
            this.activeStack = activeStack;
            fireChangeEvent();
        }

        private void fireChangeEvent() {
            for (ChangeListener changeListener : listeners.getListeners(ChangeListener.class)) {
                changeListener.stateChanged(changeEvent);
            }
        }

        public void addChangeListener(ChangeListener listener) {
            listeners.add(ChangeListener.class, listener);
        }
        public void removeChangeListener(ChangeListener listener) {
            listeners.remove(ChangeListener.class, listener);
        }

        public void add(Stack<Window> stack) {
            stacks.add(stack);
            fireIntervalAdded(this, stacks.size(), stacks.size());
        }

        public void remove(Stack<Window> stack) {
            Stack<Window> selected = activeStack != -1 && activeStack < stacks.size() ? stacks.get(activeStack) : null;

            int removedIndex = stacks.indexOf(stack);
            stacks.remove(removedIndex);
            fireIntervalRemoved(this, removedIndex, removedIndex);

            // try to keep active stack selected
            int index = stacks.indexOf(selected);
            // active stack has been removed -> select stack at same index
            if (index == -1)
                index = activeStack;
            // index out of bounds -> select last
            if (index > stacks.size() - 1)
                index = stacks.size() - 1;

            setActiveStack(index);
        }

        public Iterator<Stack<Window>> iterator() {
            return stacks.iterator();
        }
    }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.