package net.sourceforge.ganttproject.document.webdav;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.util.Collections;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JPanel;
import net.sourceforge.ganttproject.gui.AbstractTableAndActionsComponent.SelectionListener;
import net.sourceforge.ganttproject.gui.EditableList;
import net.sourceforge.ganttproject.gui.options.OptionPageProviderBase;
import net.sourceforge.ganttproject.gui.options.OptionsPageBuilder;
import net.sourceforge.ganttproject.language.GanttLanguage;
import biz.ganttproject.core.option.ChangeValueEvent;
import biz.ganttproject.core.option.ChangeValueListener;
import biz.ganttproject.core.option.DefaultBooleanOption;
import biz.ganttproject.core.option.DefaultStringOption;
import biz.ganttproject.core.option.GPOptionGroup;
import biz.ganttproject.core.option.ListOption;
import com.google.common.collect.Lists;
public class WebDavOptionPageProvider extends OptionPageProviderBase {
public WebDavOptionPageProvider() {
super("storage.webdav");
// TODO Auto-generated constructor stub
}
@Override
public GPOptionGroup[] getOptionGroups() {
// TODO Auto-generated method stub
return new GPOptionGroup[0];
}
@Override
public boolean hasCustomComponent() {
return true;
}
@Override
public Component buildPageComponent() {
WebDavStorageImpl webdavStorage = (WebDavStorageImpl) getProject().getDocumentManager().getWebDavStorageUi();
final ListOption<WebDavServerDescriptor> serversOption = webdavStorage.getServersOption();
final EditableList<WebDavServerDescriptor> serverList = new EditableList<WebDavServerDescriptor>(
Lists.newArrayList(serversOption.getValues()), Collections.EMPTY_LIST) {
@Override
protected WebDavServerDescriptor updateValue(WebDavServerDescriptor newValue, WebDavServerDescriptor curValue) {
newValue.username = curValue.username;
newValue.password = curValue.password;
newValue.setRootUrl(curValue.getRootUrl());
serversOption.updateValue(curValue, newValue);
return newValue;
}
@Override
protected WebDavServerDescriptor createValue(WebDavServerDescriptor prototype) {
serversOption.addValue(prototype);
return prototype;
}
@Override
protected void deleteValue(WebDavServerDescriptor value) {
serversOption.removeValueIndex(findIndex(value));
}
private int findIndex(WebDavServerDescriptor value) {
return Lists.newArrayList(serversOption.getValues()).indexOf(value);
}
@Override
protected WebDavServerDescriptor createPrototype(Object editValue) {
return new WebDavServerDescriptor(String.valueOf(editValue), "", "");
}
@Override
protected String getStringValue(WebDavServerDescriptor t) {
return t.name;
}
};
serverList.getTableComponent().setPreferredSize(new Dimension(150, 300));
serverList.setUndefinedValueLabel(GanttLanguage.getInstance().getText("webdav.serverNamePrompt"));
final DefaultStringOption urlOption = new DefaultStringOption("webdav.server.url");
urlOption.addChangeValueListener(new ChangeValueListener() {
@Override
public void changeValue(ChangeValueEvent event) {
serverList.getSelectedObject().setRootUrl(urlOption.getValue());
}
});
final DefaultStringOption usernameOption = new DefaultStringOption("webdav.server.username");
usernameOption.addChangeValueListener(new ChangeValueListener() {
@Override
public void changeValue(ChangeValueEvent event) {
serverList.getSelectedObject().username = usernameOption.getValue();
}
});
final DefaultStringOption passwordOption = new DefaultStringOption("webdav.server.password");
passwordOption.addChangeValueListener(new ChangeValueListener() {
@Override
public void changeValue(ChangeValueEvent event) {
serverList.getSelectedObject().password = passwordOption.getValue();
}
});
passwordOption.setScreened(true);
final DefaultBooleanOption savePasswordOption = new DefaultBooleanOption("webdav.server.savePassword", false);
savePasswordOption.addChangeValueListener(new ChangeValueListener() {
@Override
public void changeValue(ChangeValueEvent event) {
serverList.getSelectedObject().savePassword = savePasswordOption.getValue();
}
});
GPOptionGroup optionGroup = new GPOptionGroup("webdav.server", urlOption, usernameOption, passwordOption, savePasswordOption);
serverList.getTableAndActions().addSelectionListener(new SelectionListener<WebDavServerDescriptor>() {
@Override
public void selectionChanged(List<WebDavServerDescriptor> selection) {
if (selection.size() == 1) {
WebDavServerDescriptor selected = selection.get(0);
urlOption.setValue(selected.getRootUrl());
usernameOption.setValue(selected.username);
passwordOption.setValue(selected.password);
savePasswordOption.setValue(selected.savePassword);
}
}
});
int selected = Lists.newArrayList(serversOption.getValues()).indexOf(serversOption.getValue());
if (selected >= 0) {
serverList.getTableAndActions().setSelection(selected);
}
//Box result = Box.createHorizontalBox();
JPanel serversPanel = new JPanel(new BorderLayout());
serversPanel.add(serverList.createDefaultComponent(), BorderLayout.CENTER);
OptionsPageBuilder builder = new OptionsPageBuilder();
GPOptionGroup lockingGroup = new GPOptionGroup("webdav.lock", webdavStorage.getWebDavLockTimeoutOption(), webdavStorage.getWebDavReleaseLockOption());
lockingGroup.setI18Nkey(builder.getI18N().getCanonicalOptionLabelKey(webdavStorage.getWebDavLockTimeoutOption()), "webdav.lockTimeout.label");
lockingGroup.setI18Nkey(builder.getI18N().getCanonicalOptionLabelKey(webdavStorage.getWebDavReleaseLockOption()), "option.webdav.lock.releaseOnProjectClose.label");
serversPanel.add(builder.buildPlanePage(new GPOptionGroup[] {lockingGroup}), BorderLayout.SOUTH);
builder = new OptionsPageBuilder(null, OptionsPageBuilder.ONE_COLUMN_LAYOUT);
JPanel result = new JPanel(new BorderLayout());
result.add(serversPanel, BorderLayout.WEST);
JComponent serverDetails = builder.buildPlanePage(new GPOptionGroup[] {optionGroup});
serverDetails.setPreferredSize(new Dimension(300, 300));
result.add(serverDetails, BorderLayout.CENTER);
//result.add(Box.createHorizontalGlue());
return OptionPageProviderBase.wrapContentComponent(result, getCanonicalPageTitle(), null);
}
}