001package arcommon.ui.window;
002
003import java.awt.Window;
004import java.awt.event.ActionEvent;
005import java.awt.event.ActionListener;
006import java.awt.event.ComponentAdapter;
007import java.awt.event.ComponentEvent;
008
009import javax.swing.SwingUtilities;
010
011import arcommon.MyTimer;
012import arcommon.persistens.AbstractSettingWithFrameDialogAndTableSettings;
013import arcommon.persistens.DialogSettings;
014import arcommon.persistens.SettingsUtil;
015import arcommon.ui.other.GUIUtil;
016
017public abstract class AbstractSettingsJDialog extends AbstractJDialog {
018    
019    private DialogSettings dialogSettings;
020    private String dialogSettingsId;
021    private boolean created;
022    
023    public AbstractSettingsJDialog(String title) {
024        this(title, true);
025    }
026
027    public AbstractSettingsJDialog(String title, boolean closeOnESC) {
028        this(title, null, closeOnESC);
029    }
030    
031    public AbstractSettingsJDialog(String title, String pdialogSettingsId) {
032        this(title, pdialogSettingsId, true);
033    }
034    
035    public AbstractSettingsJDialog(String title, String pdialogSettingsId, boolean closeOnESC) {
036        super(title, closeOnESC);
037        
038        init(pdialogSettingsId, true);
039    }
040    
041    public AbstractSettingsJDialog(Window owner, String title, boolean closeOnESC, boolean useSettings) {
042        super(owner, title, closeOnESC);
043        
044        init(null, useSettings);
045    }
046    
047    private void init(String pdialogSettingsId, boolean useSettings) {
048        if (useSettings) {
049            if (pdialogSettingsId == null) {
050                setDialogSettingsIdAndLoadDialogSettings(getClass().getName());
051            } else {
052                setDialogSettingsIdAndLoadDialogSettings(pdialogSettingsId);
053            }
054        }
055        
056        addComponentListener(
057            new ComponentAdapter() {
058                public void componentResized(ComponentEvent e) {
059                    eventComponentResize();
060                }
061                public void componentMoved(ComponentEvent e) {
062                    eventComponentMoved();
063                }
064            }
065        );
066    }
067    
068    private void setDialogSettingsIdAndLoadDialogSettings(String pdialogSettingsId) {
069        dialogSettingsId = pdialogSettingsId;
070        
071        if (dialogSettingsId != null) {
072            AbstractSettingWithFrameDialogAndTableSettings abstractSettingWithFrameDialogAndTableSettings = ((AbstractSettingWithFrameDialogAndTableSettings)SettingsUtil.load());
073            dialogSettings = abstractSettingWithFrameDialogAndTableSettings.getDialogSettings(dialogSettingsId, false);
074        }
075    }
076    
077    public DialogSettings getDialogSettings() {
078        return dialogSettings;
079    }
080
081    public void setDialogSettings(DialogSettings pdialogSettings) {
082        dialogSettings = pdialogSettings;
083    }
084    
085    public void saveDialogSettings() {
086        AbstractSettingWithFrameDialogAndTableSettings abstractSettingWithFrameDialogAndTableSettings = ((AbstractSettingWithFrameDialogAndTableSettings)SettingsUtil.load());
087        abstractSettingWithFrameDialogAndTableSettings.saveDialogSettings(dialogSettingsId, this);
088    }
089    
090    private boolean ensureDialogSettings() {
091        if (!created) {
092            return false;
093        }
094        if (dialogSettings != null) {
095            return true;
096        }
097        if (dialogSettingsId == null) {
098            return false;
099        }
100        
101        AbstractSettingWithFrameDialogAndTableSettings abstractSettingWithFrameDialogAndTableSettings = ((AbstractSettingWithFrameDialogAndTableSettings)SettingsUtil.load());
102        dialogSettings = abstractSettingWithFrameDialogAndTableSettings.getDialogSettings(dialogSettingsId, true);
103
104        return true;
105    }
106
107    private void eventComponentResize() {
108        if (!ensureDialogSettings()) {
109            return ;
110        }
111        dialogSettings.saveDialogSettings(this);
112    }
113    
114    private void eventComponentMoved() {
115        if (!ensureDialogSettings()) {
116            return ;
117        }
118        dialogSettings.saveDialogSettings(this);
119    }
120
121    public void setVisible(boolean visible) {
122        if (visible) {
123            if (dialogSettings != null) {
124                dialogSettings.loadDialogSettings(this);
125            } else {
126                GUIUtil.packAndCenterOnScreen(this);
127            }
128        }
129        
130        // Must be done before super.setVisible(visible) on modal dialogs
131        if (visible) {
132            MyTimer.addActionListener(10, new ActionListener() {
133                @Override
134                public void actionPerformed(ActionEvent e) {
135                    MyTimer.removeActionListener(this);
136                    Runnable runnable = new Runnable() {
137                        public void run() {
138                            created = true;
139                        }
140                    };
141                    SwingUtilities.invokeLater(runnable);
142                }
143            });
144        }
145
146        super.setVisible(visible);
147    }
148    
149    private static final long serialVersionUID = 1609495835753943920L;
150}