Package cli_fmw.main

Source Code of cli_fmw.main.MainWindow$StatusListener

/*
* MainForm.java
*
* Created on 27 Декабрь 2007 г., 1:46
*/
package cli_fmw.main;


import cli_fmw.Application;
import cli_fmw.delegate.DelegateLine2;
import cli_fmw.delegate.collaborator.GUIConfig;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import javax.swing.JPanel;
import cli_fmw.login.UserInfoAbstract;
import cli_fmw.main.audit.AuditManager;
import cli_fmw.main.config.DialogRestore;
import cli_fmw.main.toolbar.ToolbarContainer;
import cli_fmw.utils.MessageBox;
import cli_fmw.utils.ModalDialog;
import cli_fmw.utils.table_config_states.StateSaver;
import framework.generic.ClipsServerConstants;
import framework.security.UserRightsSetAbstract;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Image;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.SwingConstants;
import javax.swing.Timer;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import framework.utils.Pair;
import java.awt.AWTEvent;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.event.AWTEventListener;
import java.awt.event.FocusEvent;
import java.awt.event.HierarchyEvent;
import java.awt.event.MouseEvent;
import javax.swing.JComponent;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JToolTip;



/**
*
* @author  Axe Ilshat
*/
abstract public class MainWindow extends javax.swing.JFrame
        implements PageContainer, ChangeListener, TabbedPaneBlockableListener {
  private static final long serialVersionUID = 1l;
 
    public static MainWindow mainWindow;

    private Application application;

    private final AuditManager auditManager = new AuditManager();

    JButton saveButton = new JButton();
    JButton restoreButton = new JButton();
    JButton printButton = new JButton();
    private Map<UserPanel, JButton> toolbarButtons = new HashMap<UserPanel, JButton>();
//    Map<UserPanel, ActionListener> toolbarListeners = new HashMap<UserPanel, ActionListener>();
    Font smallSystemFont = new Font("Lucide Grande", Font.PLAIN, 11);
    Timer disturbServerTimer;
    private ToolbarContainer activeToolbar = new ToolbarContainer(this);
    public static final String MENU_GROUP_PROPERTY = "group";
    private String constantTitle = "";
//    private JPopupMenu extraMenu = new JPopupMenu();


    private abstract class StatusListener implements AWTEventListener{
        public abstract void setToolTip(String tooltip);
    }
    private abstract class TooltipKiller implements AWTEventListener{
        protected StatusListener listener;

        public TooltipKiller(StatusListener statusListener) {
            listener =statusListener;
        }
    }
    private abstract class TextAutoSelector implements AWTEventListener{
    }


    /**
     * Пишет в статусбар
     */
    private StatusListener mouseListener;

    /**
     * Убивает всплывающие подсказки
     */
    private TooltipKiller tooltipKiller;

    /**
     * Выделяет текст в текстфилдах при получении фокуса
     */
    private TextAutoSelector autoSelector;

  /** Creates new form MainForm
   * @param app
   */
  @SuppressWarnings("unchecked")
    protected MainWindow(Application app) {
        initComponents();

        this.application = app;
        mainWindow = this;
        //this.loginDialogClass = loginDialogClass;

        mainTabs.addChooseListener(this);
       
        if (app.isScreenShotModeOn()) {
           // Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();
            this.setBounds(0, 0, 1024, 748);
        } else {
            Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();
            this.setBounds(0, 0, scrSize.width, scrSize.height - 200);
        }
        if (!app.isDebugModeOn()) {
            //При разработке не разворачиваем чтоб видеть вывод и стэктрейс нетбинса
            this.setExtendedState(Frame.MAXIMIZED_BOTH);
        }

        disturbServerTimer = new Timer(ClipsServerConstants.DISTURB_SERVER_PERIOD_MS, disturbListener);
        disturbServerTimer.start();
        try {
            UserInfoAbstract user = UserInfoAbstract.get();
            initPanelMenuAndToolbar(user.getPanels());
            constantTitle = makeTitle();
            this.setTitle(constantTitle);
        } catch (Exception ex) {
            MessageBox.showException(ex);
        }

        contentStateChanged();

        System.out.println("MASK_READ " + UserRightsSetAbstract.MASK_READ);
        System.out.println("MASK_WRITE: " + UserRightsSetAbstract.MASK_WRITE);


        mouseListener = new StatusListener() {

            private String text = "";
            private String tooltip;

            @Override
            public void eventDispatched(AWTEvent event) {

                Point location = MouseInfo.getPointerInfo().getLocation();
                Point p = getLocationOnScreen();
                int x = location.x - p.x;
                int y = location.y - p.y;
                Component c1 = findComponentAt(x, y);
                if (c1 instanceof JComponent) {
                    if (c1 instanceof JTable) {
                        text = ((JTable)c1).getToolTipText((MouseEvent)event);
                    } else if (event.getSource() instanceof JTabbedPane) {
                        text = ((JTabbedPane)event.getSource()).getToolTipText((MouseEvent)event);
                    } else {
                        text = ((JComponent) c1).getToolTipText();
                        if (text != null && text.trim().equals("null")) {
                            text = null;
                        }
                    }
                }
                if (text == null) {
                    text = tooltip;
                } else {
                    tooltip = null;
                }
                setStatus(text);
            }

            @Override
            public void setToolTip(String tooltip) {
                this.tooltip = tooltip;
            }
        };

        tooltipKiller = new TooltipKiller(mouseListener) {

            @Override
            public void eventDispatched(AWTEvent event) {

                HierarchyEvent he = (HierarchyEvent) event;
                if (he.getComponent() instanceof JToolTip) {
                    JToolTip jtt = (JToolTip) he.getComponent();
                    listener.setToolTip(jtt.getTipText());
                    jtt.setVisible(false);
                }

            }
        };

        autoSelector = new TextAutoSelector() {

            public void eventDispatched(AWTEvent event) {
                FocusEvent fe = (FocusEvent) event;
                if (fe.getComponent() instanceof JTextField
                        && fe.getID() == FocusEvent.FOCUS_GAINED
                        && fe.getComponent().isEnabled()
                        && ((JTextField)fe.getComponent()).isEditable()){
                    ((JTextField)fe.getComponent()).selectAll();
                }
            }
        };

        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                Toolkit.getDefaultToolkit().addAWTEventListener(
                        tooltipKiller,  AWTEvent.HIERARCHY_EVENT_MASK);
                Toolkit.getDefaultToolkit().addAWTEventListener(
                        mouseListener,  AWTEvent.MOUSE_MOTION_EVENT_MASK);
                Toolkit.getDefaultToolkit().addAWTEventListener(
                        autoSelector,   AWTEvent.FOCUS_EVENT_MASK);
            }
        });

    StateSaver.attachTo(this);
    }

    protected String makeTitle() throws Exception {
            UserInfoAbstract user = UserInfoAbstract.get();
            String u = user.getUserName();
            String s = u
                    + (user.isSuperUser() ? " [СУПЕР-ПОЛЬЗОВАТЕЛЬ] " : " ");
            return s;
    }
   
    private ActionListener disturbListener = new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            try {
                UserInfoAbstract.get().disturbServer();
            } catch (Throwable ex) {
                disturbServerTimer.stop(); //
            }
        }
    };

    protected void refreshWindowTitle(PageGeneric page) {
        if (page != null) {
            String pageTitle = page.getPageTitle();
            this.setTitle(constantTitle + " - " + pageTitle);
        } else {
            this.setTitle(constantTitle);
        }
    }

    public void relogin() {
        this.dispose();
        application.logout();
        application.login();
    }

    private void initExitMenu() {
        JMenu exitMenu = new JMenu("Сеанс");

        AbstractAction relog = new AbstractAction(){
                                private static final long serialVersionUID = 1l;
                                public void actionPerformed(ActionEvent e) {
                                        relogin();
                                }
                        };
        relog.putValue(Action.SHORT_DESCRIPTION, "Завершение сеанса");
        relog.putValue(Action.NAME, "Завершение сеанса");
        exitMenu.add(relog);

        AbstractAction ex = new AbstractAction() {
      private static final long serialVersionUID = 1l;

      public void actionPerformed(ActionEvent e) {
        MainWindow.this.dispose();
        application.onAppExit();
      }
    };
        ex.putValue(Action.NAME, "Выход");
        exitMenu.add(ex);

        mainMenu.add(exitMenu);
    }

  @Override
  public void dispose() {
        if (tooltipKiller != null) {
            Toolkit.getDefaultToolkit().removeAWTEventListener(tooltipKiller);
        }
        if (mouseListener != null){
            Toolkit.getDefaultToolkit().removeAWTEventListener(mouseListener);
        }
        if (autoSelector != null){
            Toolkit.getDefaultToolkit().removeAWTEventListener(autoSelector);
        }
    mainWindow = null;
    super.dispose();
  }

    /**
     * Инициализирует меню и тулбар
     * @param avialiablePanels
     */

    public void addPasswdMenuItem() {
        Object[] cp = mainMenu.getSubElements();
        JMenu groupMenu = null;
        for (int i = 0; i < cp.length; i++) {
            if (cp[i] instanceof JMenu) {
                Object a = ((JMenu) cp[i]).getClientProperty(MENU_GROUP_PROPERTY);
                if (a != null && a.equals(UserPanelsEnumSimple.adminManager)) {
                    groupMenu = (JMenu) cp[i];
                    break;
                }
            }
        }
        if (groupMenu == null) {
            groupMenu = new JMenu(UserPanelsEnumSimple.adminManager.getTitle());
            groupMenu.putClientProperty(MENU_GROUP_PROPERTY, UserPanelsEnumSimple.adminManager);
            mainMenu.add(groupMenu);
        } else {
            groupMenu.addSeparator();
        }
        //Изменение пароля пользователя через конфигурацию пользователя
        //Изменение пароля суперпользователя через конфигурацию сервера
        /*JMenuItem item = new JMenuItem("Изменить пароль супер пользователя");
        item.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                ChangePasswordDialog.ChangePassword("Изменение своего пароля", mainWindow, new ChangeAdminPassword());
            }
        });
        groupMenu.add(item);
        if (UserInfoAbstract.get().isSuperUser()) {
            groupMenu.addSeparator();
            item = new JMenuItem("Изменить супер-пароль");
            item.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent arg0) {
                    ChangePasswordDialog.ChangePassword("Изменение супер-пароля", mainWindow, new ChangeAdminPassword());
                }
            });
            groupMenu.add(item);
        }*/
    }

    private void initPanelMenuAndToolbar(Set<UserPanel> avialiablePanels) {
        GUIConfig guiConfig = UserInfoAbstract.get().getGuiConfig();

        Map<UserPanelGroup, Menu> groupMenuMap = new HashMap<UserPanelGroup, Menu>();
        SortedSet<Menu> rootSet = new TreeSet<Menu>();

        mainMenu.removeAll();
        panelsBar.removeAll();

        initExitMenu();
        initToolbar();

        Iterator<UserPanel> it = avialiablePanels.iterator();
        while (it.hasNext()) {
            UserPanel panel = it.next();
            System.out.print("[" + panel + "] ");
            Menu root = null;
            if (panel.getDelegateClass() == null) {
                UserPanelGroup group = panel.getGroup();
                UserPanelGroup parent;
                while (group != null) {
                    parent = group.getParent();
                    Menu childJMenu = groupMenuMap.get(group);
                    if (childJMenu == null) {
                        childJMenu = new Menu(group);
                        groupMenuMap.put(group, childJMenu);
                    }
                    root = childJMenu;

                    System.out.print(" --> " + group);
                    if (parent != null) {
                        Menu parentJMenu = groupMenuMap.get(parent);
                        if (parentJMenu == null) {
                            parentJMenu = new Menu(parent);
                            groupMenuMap.put(parent, parentJMenu);
                        }
                        parentJMenu.add(childJMenu);
                        parent = group.getParent();
                    }
                    group = parent;
                }
            }else{
                System.out.print(" --> панель инструментов");
            }
            addPanelCommand(panel, groupMenuMap.get(panel.getGroup()), guiConfig);
            if (root != null){
                System.out.println("(root)");
                rootSet.add(root);
            }else{
                System.out.println();
            }
        }

        Iterator<Menu> iterator = rootSet.iterator();
        while (iterator.hasNext()) {
            mainMenu.add(iterator.next().createMenu());
        }

        addPasswdMenuItem();

        createToolbars();

        mainToolbar.revalidate();
        panelsBar.revalidate();
        jPanel1.revalidate();
    }

    /**
     * add buttons from map to toolbars and sort them by group
     */
    private void createToolbars() {
        UserPanel[] up = new UserPanel[toolbarButtons.keySet().size()];
        Iterator<UserPanel> it = toolbarButtons.keySet().iterator();
        int i = 0;
        while (it.hasNext()) {
            UserPanel p = it.next();
            up[i] = p;
            i++;
        }
        Arrays.sort(up, new Comparator<UserPanel>() {

            @Override
            public int compare(UserPanel o1, UserPanel o2) {
                return (o1).compareTo(o2);
            }
        });
        UserPanelGroup currentGroup = up.length > 0 ? up[0].getGroup() : null;
        for (UserPanel userPanel : up) {
            JButton button = toolbarButtons.get(userPanel);
            if (!currentGroup.equals(userPanel.getGroup())){
                currentGroup = userPanel.getGroup();
                panelsBar.addSeparator();
//                extraMenu.addSeparator();
            }
            panelsBar.add(button);
//            Image i1 = userPanel.getIcon().getImage().getScaledInstance(24, 24, Image.SCALE_SMOOTH);
//            JMenuItem jMenuItem = new JMenuItem(userPanel.getTitle(), new ImageIcon(i1));
//            jMenuItem.addActionListener(new ActivatePanelAction(userPanel, this));
//            extraMenu.add(jMenuItem);
        }
//        extraMenu.setBorder(new LineBorder(Color.BLACK));
        ArrayList<JButton> buttons = activeToolbar.getButtons();
        for (JButton jButton : buttons) {
            mainToolbar.add(jButton);
        }
       
    }

    /**
     *
     * @param gr
     */
    private void addPanelCommand(UserPanel p, Menu menu, GUIConfig guiConfig) {
        String commandString = p.getTitle();
        String tip = p.getDescription();

//        ActionListener al = new ActivatePanelAction(p, this);
        ImageIcon icon = p.getIcon();

        if (p.getDelegateClass() == null) {
            ActionListener al = new ActivatePanelAction(p, this);
            JMenuItem item = new JMenuItem(commandString);
            item.addActionListener(al);
            item.setToolTipText(tip);

            Image smallImage = icon.getImage().getScaledInstance(20, 20, Image.SCALE_SMOOTH);
            item.setIcon(new ImageIcon(smallImage));
            menu.add(new Pair<JMenuItem, UserPanel>(item, p));
            if (p.getGroup().getParent() == null){
                JButton button = new JButton(icon);
                button.setToolTipText(tip);

                if (guiConfig.getBoolean("")) {
                    button.setText(commandString);
                    button.setVerticalTextPosition(SwingConstants.BOTTOM);
                    button.setHorizontalTextPosition(SwingConstants.CENTER);
                    button.setFont(smallSystemFont);
                }
                button.addActionListener(al);
                toolbarButtons.put(p, button);
//                panelsBar.add(button);
            }
        }else{
            activeToolbar.addButton(p);
        }
    }

    protected void initToolbar() {

        GUIConfig guiConfig = UserInfoAbstract.get().getGuiConfig();

        //CLOSE BUTTON
        saveButton.setFont(smallSystemFont);
        saveButton.setActionCommand("SAVE");
        saveButton.setToolTipText("Сохранить");
        if (guiConfig.getBoolean("")) {
            saveButton.setText("Сохранить");
        }
        saveButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                try {
                    Persistentable persist = (Persistentable) getActivePage();
                    persist.save();
                } catch (Exception ex) {
                    MessageBox.showExceptionOnly(ex);
                }
            }
        });
        saveButton.setIcon(new ImageIcon(getClass().getResource("/resources/icons/toolbar/save.png")));
        saveButton.setEnabled(false);
        mainToolbar.add(saveButton);

        //RESTORE BUTTON
        restoreButton.setFont(smallSystemFont);
        restoreButton.setActionCommand("Restore");
        restoreButton.setToolTipText("Отменить все изменения");
        if (guiConfig.getBoolean("")) {
            restoreButton.setText("Отменить");
        }
        restoreButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                GUIConfig config = UserInfoAbstract.get().getGuiConfig();
                boolean confirm = config.getBoolean(GUIConfig.P_CONFIRM_UNDO);
                if (confirm){
                    DialogRestore dr = new DialogRestore(mainWindow, getAuditManager());
                    dr.setVisible(true);
                    if (dr.getDlgResult() == ModalDialog.DLG_OK){
                        Persistentable persistent = (Persistentable) getActivePage();
                        persistent.restore();
                    }
                    if (!dr.needConfirm()){
                        config.setValue(GUIConfig.P_CONFIRM_UNDO, false);
                        try {
                            UserInfoAbstract.get().getCollaboratorLocal().saveGuiConfig(config);
                        } catch (ClipsException ex) {
                            MessageBox.showException(new ClipsException("Не удалось сохранить конфигурацию интерфейса", ex));
                        }
                    }
                }else{
                    Persistentable persistent = (Persistentable) getActivePage();
                    persistent.restore();
                }
            }
        });
        restoreButton.setIcon(new ImageIcon(getClass().getResource("/resources/icons/toolbar/undo.png")));
        restoreButton.setEnabled(false);
        mainToolbar.add(restoreButton);

        //Print Button
        printButton.setFont(smallSystemFont);
        printButton.setActionCommand("Print");
        printButton.setToolTipText("Печать");
        if (guiConfig.getBoolean("")) {
            printButton.setText("Печать");
        }
        printButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                Printable print = (Printable) getActivePage();
                print.print();
            }
        });
        printButton.setIcon(new ImageIcon(getClass().getResource("/resources/icons/toolbar/printer.png")));
        printButton.setEnabled(false);
        mainToolbar.add(printButton);
        mainToolbar.addSeparator();
    }

    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel5 = new javax.swing.JPanel();
        mainToolbar = new javax.swing.JToolBar();
        jPanel2 = new javax.swing.JPanel();
        jPanel1 = new javax.swing.JPanel();
        mainTabs = new cli_fmw.main.TabbedPaneBlockable();
        panelsBar = new cli_fmw.utils.PanelBar();
        jPanel3 = new javax.swing.JPanel();
        lblStatus = new javax.swing.JLabel();
        jLabel1 = new javax.swing.JLabel();
        mainMenu = new javax.swing.JMenuBar();

        javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
        jPanel5.setLayout(jPanel5Layout);
        jPanel5Layout.setHorizontalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 424, Short.MAX_VALUE)
        );
        jPanel5Layout.setVerticalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 298, Short.MAX_VALUE)
        );

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosed(java.awt.event.WindowEvent evt) {
                formWindowClosed(evt);
            }
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
        });
        addComponentListener(new java.awt.event.ComponentAdapter() {
            public void componentResized(java.awt.event.ComponentEvent evt) {
                formComponentResized(evt);
            }
        });
        getContentPane().add(mainToolbar, java.awt.BorderLayout.NORTH);

        jPanel2.setLayout(new java.awt.BorderLayout());

        jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jPanel1.setLayout(new java.awt.BorderLayout());

        mainTabs.setTabPlacement(javax.swing.JTabbedPane.BOTTOM);
        jPanel1.add(mainTabs, java.awt.BorderLayout.CENTER);

        jPanel2.add(jPanel1, java.awt.BorderLayout.CENTER);
        jPanel2.add(panelsBar, java.awt.BorderLayout.NORTH);

        getContentPane().add(jPanel2, java.awt.BorderLayout.CENTER);

        jPanel3.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 2, 2, 2));
        jPanel3.setLayout(new java.awt.BorderLayout());

        lblStatus.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        lblStatus.setVerticalAlignment(javax.swing.SwingConstants.TOP);
        lblStatus.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT);
        jPanel3.add(lblStatus, java.awt.BorderLayout.CENTER);

        jLabel1.setForeground(jLabel1.getBackground());
        jLabel1.setText("|");
        jPanel3.add(jLabel1, java.awt.BorderLayout.EAST);

        getContentPane().add(jPanel3, java.awt.BorderLayout.SOUTH);
        setJMenuBar(mainMenu);

        pack();
    }// </editor-fold>//GEN-END:initComponents

private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosed
    System.out.println("------------------------>formWindowClosed");//GEN-LAST:event_formWindowClosed
}                                

private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
    try {
        if (UserInfoAbstract.get() != null) {
            UserInfoAbstract.get().logout();
    }
    } catch (Exception ex) {
        MessageBox.showExceptionOnly(ex);
    }
  dispose();
    application.onAppExit();
}//GEN-LAST:event_formWindowClosing

private void formComponentResized(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentResized
    mainTabs.resizeTabs();
}//GEN-LAST:event_formComponentResized
    /**
     * Adds new page to container
     * @param pageToAdd Link to page to add
     * @param afterPage where to insert new page
     * @return added page
     * @throws PageException
     */
    @Override
    public PageGeneric addNewPage(PageGeneric pageToAdd, PageGeneric afterPage) throws PageException {
        //Проверка на существование окна того же класса с тем же делегатом (либо не имеющие делегатов)
        DelegateLine2 delegate = pageToAdd.getDelegate();
        if (delegate != null && delegate.getID() != 0) {
            for (int i = 0; i < getPageCount(); i++) {
                PageGeneric page = getPage(i);
                if (page.getClass() == pageToAdd.getClass()
                        && page.getDelegate() != null
                        && page.getDelegate().getID() == delegate.getID()) {
                    activatePage(page);
                    return page;
                }
            }
        } else if (delegate == null) {
            for (int i = 0; i < getPageCount(); i++) {
                PageGeneric page = getPage(i);
                if (page.getClass() == pageToAdd.getClass()
                        && page.getDelegate() == null) {
                    activatePage(page);
                    return page;
                }
            }
        }
       
        ImageIcon icon = null;
        if (pageToAdd instanceof HasIcon) {
            HasIcon iconable = (HasIcon) pageToAdd;
            icon = iconable.getIcon();
        }
        int index = -1;
        if (afterPage != null) {
            for (int i = 0; i < getPageCount(); i++) {
                PageGeneric page = getPage(i);
                if (page == afterPage) {
                    index = i + 1;
                    if (pageToAdd instanceof OpenCloseSensitive) {
                        ((OpenCloseSensitive) pageToAdd).beforeOpen();
                    }
                    mainTabs.insertTab(index, pageToAdd);
                    activatePage(pageToAdd);
                    break;
                }
            }
        } else {
            if (pageToAdd instanceof OpenCloseSensitive) {
                ((OpenCloseSensitive) pageToAdd).beforeOpen();
            }
            mainTabs.addTab(pageToAdd);
            activatePage(pageToAdd);
            index = getPageCount() - 1;
        }

        //mainTabs.setTabComponentAt(index, new TabHead(pageToAdd));
        return pageToAdd;
    }

    /**
     * Removes page from getContainer(). Must be called last in procedure.
     * @param page PageGeneric to remove
     * @throws java.lang.Exception Generic exception
     */
    @Override
    public void removePage(PageGeneric pageToRemove, boolean forced) throws PageException {
        for (int i = 0; i < getPageCount(); i++) {
            PageGeneric page = getPage(i);
            if (page == pageToRemove) {
                if (pageToRemove instanceof ActivateSensitive) {
                    ActivateSensitive as = (ActivateSensitive) pageToRemove;
                    as.beforeDeactivate();
                }
                boolean canBeClosed = true;
                if (pageToRemove instanceof Persistentable) {
                    Persistentable p = (Persistentable) pageToRemove;
                   
                    if (forced) {
                        canBeClosed = true;
                    } else if (p.isDirty()) {
                        try {
                            int res = MessageBox.showConfirmYesNoCancel(
                                    MessageBox.C_SAVE_CHANGES);
                            switch (res) {
                                case MessageBox.ANSWER_YES:
                                    p.save();
                                    canBeClosed = !p.isDirty();
                                    break;
                                case MessageBox.ANSWER_NO:
                                    p.restore();
                                    canBeClosed = true;
                                    break;
                                case MessageBox.ANSWER_CANCEL:
                                    return;
                            }
                           
                        } catch (ClipsException ex) {
                            throw new PageException("Страница не может быть закрыта: ",ex);
                        }
                    }
                   
                }
                if (canBeClosed) {
                    if (pageToRemove instanceof OpenCloseSensitive) {
                        ((OpenCloseSensitive) pageToRemove).beforeClose();
                    }
                    int index = mainTabs.indexOfComponent((JPanel) pageToRemove);
                    if (index > 0 && getPage(index - 1) instanceof ActivateSensitive) {
                        mainTabs.remove((JPanel) pageToRemove);
                        if (!((ActivateSensitive)getPage(index - 1)).canBeActivated()) {
                            mainTabs.setSelectedIndex(-1);
                        }
                    } else {
                        mainTabs.remove((JPanel) pageToRemove);
                    }
                }
                activeToolbar.updaterToolbar();
                refreshButtons(this.getActivePage());
                refreshWindowTitle(this.getActivePage());
                return;
            }
        }
        throw new PageException("Unknown page to remove");
    }

    /**
     * Activates the specified page in container
     * @param page Which page to activate
     * @throws java.lang.Exception GenericException
     */
    @Override
    public void activatePage(PageGeneric pageToActivate) throws PageException {
        activeToolbar.updaterToolbar();
        for (int i = 0; i < getPageCount(); i++) {
            PageGeneric page = getPage(i);
            if (page == pageToActivate) {
                if (mainTabs.getSelectedIndex() != i) {
                    boolean canBeActivated = true;
                    if (pageToActivate instanceof ActivateSensitive) {
                        ActivateSensitive as = (ActivateSensitive) pageToActivate;
                        as.beforeActivate();
                        canBeActivated = as.canBeActivated();
                    }

                    if (canBeActivated) {
                        mainTabs.setSelectedComponent((JPanel) pageToActivate);
                        contentStateChanged();
//                        activationStack.addPage(page);
                    }
                }else{
//                    activationStack.addPage(page);
                }
                return;
            }
        }
        throw new PageException("Unknown page to activate");
    }

    /**
     *
     * @param page
     * @throws java.lang.Exception
     */
    @Override
    public void contentStateChanged() {
        PageGeneric page = getActivePage();
        refreshButtons(page);
        refreshPageTitles();

        activeToolbar.updaterToolbar();
    }

    private void refreshButtons(PageGeneric page) {
        if (page == null) {
            saveButton.setEnabled(false);
            restoreButton.setEnabled(false);
            printButton.setEnabled(false);
        } else {
            //persist
            if (page instanceof Persistentable) {
                boolean isdirty = ((Persistentable) page).isDirty();
                saveButton.setEnabled(isdirty);
                restoreButton.setEnabled(isdirty);
            } else {
                saveButton.setEnabled(false);
                restoreButton.setEnabled(false);
            }
            //print
            if (page instanceof Printable) {
                boolean isReady = ((Printable) page).readyForPrint();
                printButton.setEnabled(isReady);
            } else {
                printButton.setEnabled(false);
            }
        }
    }

    /**
     * Обновляет заголовки страниц
     */
    private void refreshPageTitles() {
        if (mainTabs != null) {
            for (int i = 0; i < mainTabs.getTabCount(); i++) {
                PageGeneric page = getPage(i);
                String title = page.getPageTitle();
                mainTabs.setTitleAt(i, title);
            }
        }
    }

    /**
     *
     * @return
     * @throws java.lang.Exception
     */
    @Override
    public PageGeneric getActivePage() {
        return (PageGeneric) mainTabs.getSelectedComponent();
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel5;
    private javax.swing.JLabel lblStatus;
    private javax.swing.JMenuBar mainMenu;
    private cli_fmw.main.TabbedPaneBlockable mainTabs;
    private javax.swing.JToolBar mainToolbar;
    private cli_fmw.utils.PanelBar panelsBar;
    // End of variables declaration//GEN-END:variables

  public Application getApplication() {
    return application;
  }

  public static MainWindow getMainWindow() {
    return mainWindow;
  }

  @Override
    public int getPageCount() {
        //getTabCount && getComponentAt - used together
        return mainTabs.getTabCount();
    }

    @Override
    public PageGeneric getPage(int index) {
        return (PageGeneric) mainTabs.getComponentAt(index);
    }

    @Override
    public void stateChanged(ChangeEvent e) {
        contentStateChanged();
    }

    @Override
    public void tryChoose(int index) throws PageException {
        if (index < 0 || index >= mainTabs.getTabCount()) {
            return;
        }
        PageGeneric p = (PageGeneric) mainTabs.getComponentAt(index);
        if (p instanceof ActivateSensitive){
            ActivateSensitive as = (ActivateSensitive) p;
            if (!as.canBeActivated()){
                throw new PageException("Не может быть активирована");
            }
            as.beforeActivate();
        }
    }

    public void chooseDone() {
        activeToolbar.updaterToolbar();
        PageGeneric page = this.getActivePage();
//        activationStack.addPage(page);
        refreshButtons(page);
        refreshWindowTitle(page);
//        System.out.println(activationStack.toString());
    }



    private class Menu implements Comparable<Menu> {

        private UserPanelGroup group;
        private JMenu jMenu = null;
        private ArrayList<Pair<JMenuItem, UserPanel>> menuItems;

        public Menu(UserPanelGroup group) {
            this.group = group;
            this.menuItems = new ArrayList<Pair<JMenuItem, UserPanel>>();
        }

        ArrayList<Menu> items = new ArrayList<Menu>();

        /**
         * Create menu intem by saving group with including menus
         * all calls after first method returns created item
         * @return created menu
         */
        protected JMenu createMenu(){
            if (jMenu == null) {
                jMenu = new JMenu(group.getTitle());
                jMenu.putClientProperty(MENU_GROUP_PROPERTY, group);
                sortMenu();
                for (Menu menu : items) {
                    jMenu.add(menu.createMenu());
                }
            }
            loadItems();
            return jMenu;
        }

        /**
         * Add saving items into current JMenu
         */
        protected void loadItems(){
            Collections.sort(menuItems, new Comparator<Pair<JMenuItem, UserPanel>>() {
                @Override
                public int compare(Pair<JMenuItem, UserPanel> o1, Pair<JMenuItem, UserPanel> o2) {
                    return o1.second.compareTo(o2.second);
                }
            });
            for (Pair<JMenuItem, UserPanel> pair : menuItems) {
                jMenu.remove(pair.first);
                jMenu.add(pair.first);
            }
        }

        private void sortMenu() {
            Collections.sort(items);
        }

        private void add(Menu menu){
            items.add(menu);
        }

        private void add(Pair<JMenuItem, UserPanel> pair){
            menuItems.add(pair);
        }

        @Override
        public int compareTo(Menu o) {
            return this.group.compareTo(o.group);
        }

    }

    public ActionListener getPanelListeners(UserPanel panel){
        ActionListener listener = activeToolbar.getListener(panel);
        if (listener == null){
            listener = new ActivatePanelAction(panel, this);
        }
        return listener;
    }

    /**
     * Выставляет надпись в статусбар
     * @param status
     */
    protected void setStatus(String status){
        lblStatus.setText(status != null ? status : "");
    }

    @Override
    public AuditManager getAuditManager() {
        return auditManager;
    }



}
TOP

Related Classes of cli_fmw.main.MainWindow$StatusListener

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.
auto'); ga('send', 'pageview');