/*
* Copyright (c) 2014 tabletoptool.com team.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* rptools.com team - initial implementation
* tabletoptool.com team - further development
*/
package com.t3.swing.preference;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.prefs.Preferences;
import com.t3.swing.TaskPanel;
import com.t3.swing.TaskPanelGroup;
public class TaskPanelGroupPreferences implements PropertyChangeListener {
private TaskPanelGroup group;
private Preferences prefs;
private boolean restoringState; // I don't like this, rethink it later.
private static final String PREF_KEY = "state_list";
public TaskPanelGroupPreferences(String appName, String controlName, TaskPanelGroup group) {
this.group = group;
prefs = Preferences.userRoot().node(appName + "/control/" + controlName);
restoreTaskPanelStates();
connect();
}
protected void connect() {
for (TaskPanel taskPanel : group.getTaskPanels()) {
connectToTaskPanel(taskPanel);
}
// Make sure to get all future task panels
group.addPropertyChangeListener(TaskPanelGroup.TASK_PANEL_LIST, this);
}
private void connectToTaskPanel(TaskPanel taskPanel) {
taskPanel.addPropertyChangeListener(TaskPanel.TASK_PANEL_STATE, this);
}
public void disconnect() {
group.removePropertyChangeListener(TaskPanelGroup.TASK_PANEL_LIST, this);
for (TaskPanel taskPanel : group.getTaskPanels()) {
disconnectFromTaskPanel(taskPanel);
}
group = null;
prefs = null;
}
private void disconnectFromTaskPanel(TaskPanel taskPanel) {
taskPanel.removePropertyChangeListener(TaskPanel.TASK_PANEL_STATE, this);
}
private void saveTaskPanelStates() {
List<String> stateList = new ArrayList<String>();
for (TaskPanel taskPanel : group.getTaskPanels()) {
stateList.add(taskPanel.getTitle());
stateList.add(taskPanel.getState().name());
}
saveStates(stateList);
}
private void restoreTaskPanelState(TaskPanel taskPanel) {
List<String> states = loadStates();
try {
restoringState = true;
for (Iterator<String> iter = states.iterator(); iter.hasNext();) {
String title = iter.next();
String state = iter.next();
if (taskPanel.getTitle().equals(title)) {
taskPanel.setState(TaskPanel.State.valueOf(state));
break;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
restoringState = false;
}
}
private void restoreTaskPanelStates() {
List<String> states = loadStates();
try {
restoringState = true;
for (Iterator<String> iter = states.iterator(); iter.hasNext();) {
String title = iter.next();
String state = iter.next();
TaskPanel taskPanel = group.getTaskPanel(title);
if (taskPanel == null) {
continue;
}
taskPanel.setState(TaskPanel.State.valueOf(state));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
restoringState = false;
}
}
private List<String> loadStates() {
String stateList = prefs.get(PREF_KEY, null);
if (stateList == null) {
return new ArrayList<String>();
}
String[] states = stateList.split("\\|");
return Arrays.asList(states);
}
private void saveStates(List<String> stateList) {
StringBuilder builder = new StringBuilder();
for (Iterator<String> iter = stateList.iterator(); iter.hasNext();) {
builder.append(iter.next()).append("|").append(iter.next());
if (iter.hasNext()) {
builder.append("|");
}
}
prefs.put(PREF_KEY, builder.toString());
}
////
// PROPERTY CHANGE LISTENER
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (restoringState) {
return;
}
if (TaskPanelGroup.TASK_PANEL_LIST.equals(evt.getPropertyName())) {
TaskPanel taskPanel = (TaskPanel) evt.getNewValue();
connectToTaskPanel(taskPanel);
restoreTaskPanelState(taskPanel);
} else {
saveTaskPanelStates();
}
}
}