/*
* 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;
}
}