/* ******************************************************************************
* Copyright (c) 2006-2012 XMind Ltd. and others.
*
* This file is a part of XMind 3. XMind releases 3 and
* above are dual-licensed under the Eclipse Public License (EPL),
* which is available at http://www.eclipse.org/legal/epl-v10.html
* and the GNU Lesser General Public License (LGPL),
* which is available at http://www.gnu.org/licenses/lgpl.html
* See http://www.xmind.net/license.html for details.
*
* Contributors:
* XMind Ltd. - initial API and implementation
*******************************************************************************/
package org.xmind.ui.internal.views;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IPropertyListener;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.part.Page;
import org.xmind.core.Core;
import org.xmind.core.IMeta;
import org.xmind.core.IWorkbook;
import org.xmind.core.event.CoreEvent;
import org.xmind.core.event.ICoreEventListener;
import org.xmind.core.event.ICoreEventRegistration;
import org.xmind.core.event.ICoreEventSource;
import org.xmind.gef.command.Command;
import org.xmind.gef.command.ICommandStack;
import org.xmind.gef.ui.actions.IActionRegistry;
import org.xmind.gef.ui.editor.IGraphicalEditor;
import org.xmind.gef.ui.editor.IGraphicalEditorPage;
import org.xmind.ui.commands.CommandMessages;
import org.xmind.ui.commands.ModifyMetadataCommand;
import org.xmind.ui.internal.MindMapMessages;
import org.xmind.ui.resources.FontUtils;
import org.xmind.ui.tabfolder.PageBookPage;
public class WorkbookRevisionsPage extends PageBookPage
implements ICoreEventListener, Listener, IPropertyListener {
private static final String K_AUTO_SAVE = IMeta.CONFIG_AUTO_REVISION_GENERATION;
private static final String V_YES = IMeta.V_YES;
private static final String V_NO = IMeta.V_NO;
private Button autoSaveOption = null;
private IWorkbook workbook;
private ICoreEventRegistration coreEventReg = null;
private Composite container;
/**
*
*/
public WorkbookRevisionsPage(IGraphicalEditor editor) {
super(editor);
this.workbook = (IWorkbook) editor.getAdapter(IWorkbook.class);
}
public IGraphicalEditor getEditor() {
return (IGraphicalEditor) super.getSourcePageProvider();
}
/*
* (non-Javadoc)
*
* @see
* org.xmind.ui.tabfolder.PageBookPage#createControl(org.eclipse.swt.widgets
* .Composite)
*/
@Override
public void createControl(Composite parent) {
container = new Composite(parent, SWT.NONE);
GridLayout gridLayout = new GridLayout(1, false);
gridLayout.marginWidth = 0;
gridLayout.marginHeight = 0;
gridLayout.verticalSpacing = 0;
gridLayout.horizontalSpacing = 0;
container.setLayout(gridLayout);
Composite contentContainer = new Composite(container, SWT.NONE);
contentContainer.setLayout(new FillLayout());
GridData contentLayoutData = new GridData(SWT.FILL, SWT.FILL, true,
true);
contentLayoutData.widthHint = SWT.DEFAULT;
contentLayoutData.heightHint = SWT.DEFAULT;
contentContainer.setLayoutData(contentLayoutData);
super.createControl(contentContainer);
Composite optionContainer = new Composite(container, SWT.NONE);
GridLayout optionLayout = new GridLayout(1, false);
optionLayout.marginWidth = 5;
optionLayout.marginHeight = 5;
optionLayout.verticalSpacing = 5;
optionLayout.horizontalSpacing = 5;
optionContainer.setLayout(optionLayout);
GridData optionLayoutData = new GridData(SWT.FILL, SWT.FILL, true,
false);
optionLayoutData.widthHint = SWT.DEFAULT;
optionLayoutData.heightHint = SWT.DEFAULT;
optionContainer.setLayoutData(optionLayoutData);
fillOptions(optionContainer);
handleWorkbookChange();
getEditor().addPropertyListener(this);
autoSaveOption.addListener(SWT.Selection, this);
}
/*
* (non-Javadoc)
*
* @see org.xmind.ui.tabfolder.PageBookPage#getControl()
*/
@Override
public Control getControl() {
return container;
}
/*
* (non-Javadoc)
*
* @see org.xmind.ui.tabfolder.PageBookPage#dispose()
*/
@Override
public void dispose() {
getEditor().removePropertyListener(this);
if (coreEventReg != null) {
coreEventReg.unregister();
coreEventReg = null;
}
super.dispose();
}
private void fillOptions(Composite parent) {
// titleLabel = new Label(parent, SWT.NONE);
// titleLabel.setFont(FontUtils.getNewHeight(JFaceResources.DEFAULT_FONT,
// 11));
// GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, false);
// titleLabel.setLayoutData(layoutData);
autoSaveOption = new Button(parent, SWT.CHECK | SWT.WRAP);
autoSaveOption.setFont(
FontUtils.getNewHeight(JFaceResources.DEFAULT_FONT, -1));
autoSaveOption.setText(
MindMapMessages.WorkbookRevisionsPage_AutoSaveRevisionsCheck_text);
autoSaveOption
.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
}
/*
* (non-Javadoc)
*
* @see
* org.xmind.ui.tabfolder.PageBookPage#createDefaultPage(org.eclipse.swt
* .widgets.Composite)
*/
@Override
protected Control createDefaultPage(Composite parent) {
return new Composite(parent, SWT.NONE);
}
/*
* (non-Javadoc)
*
* @see
* org.xmind.ui.tabfolder.PageBookPage#doCreateNestedPage(java.lang.Object)
*/
@Override
protected Page doCreateNestedPage(Object sourcePage) {
return new RevisionsPage((IGraphicalEditorPage) sourcePage);
}
/*
* (non-Javadoc)
*
* @see org.xmind.ui.tabfolder.PageBookPage#refreshGlobalActionHandlers()
*/
@Override
protected void refreshGlobalActionHandlers() {
super.refreshGlobalActionHandlers();
// Set new actions from editor.
IActionRegistry registry = (IActionRegistry) getEditor()
.getAdapter(IActionRegistry.class);
if (registry != null) {
initGlobalActionHandlers(getSite().getActionBars(), registry);
}
}
protected void initGlobalActionHandlers(IActionBars bars,
IActionRegistry registry) {
setGlobalActionHandler(bars, registry, ActionFactory.UNDO.getId());
setGlobalActionHandler(bars, registry, ActionFactory.REDO.getId());
}
protected void setGlobalActionHandler(IActionBars bars,
IActionRegistry registry, String actionId) {
IAction action = registry.getAction(actionId);
if (action != null) {
bars.setGlobalActionHandler(actionId, action);
}
}
/*
* (non-Javadoc)
*
* @see
* org.xmind.core.event.ICoreEventListener#handleCoreEvent(org.xmind.core
* .event.CoreEvent)
*/
public void handleCoreEvent(CoreEvent event) {
if (getControl() == null || getControl().isDisposed())
return;
if (K_AUTO_SAVE.equals(event.getTarget())) {
getControl().getDisplay().asyncExec(new Runnable() {
public void run() {
updateAutoSaveOption();
}
});
}
}
/**
*
*/
private void updateAutoSaveOption() {
if (workbook != null) {
autoSaveOption.setEnabled(true);
autoSaveOption.setSelection(isAutoSave(workbook));
} else {
autoSaveOption.setEnabled(false);
}
}
private static final boolean isAutoSave(IWorkbook workbook) {
String value = workbook.getMeta().getValue(K_AUTO_SAVE);
return value == null || V_YES.equalsIgnoreCase(value);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.
* Event)
*/
public void handleEvent(Event event) {
if (event.type == SWT.Selection) {
boolean selection = ((Button) event.widget).getSelection();
Command command = new ModifyMetadataCommand(workbook, K_AUTO_SAVE,
selection ? V_YES : V_NO);
command.setLabel(selection
? CommandMessages.Command_TurnOnAutoRevisionSaving
: CommandMessages.Command_TurnOffAutoRevisionSaving);
ICommandStack commandStack = getEditor().getCommandStack();
if (commandStack != null) {
commandStack.execute(command);
} else {
command.execute();
}
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.IPropertyListener#propertyChanged(java.lang.Object,
* int)
*/
public void propertyChanged(Object source, int propId) {
if (propId == IEditorPart.PROP_INPUT) {
handleWorkbookChange();
}
}
private void handleWorkbookChange() {
if (coreEventReg != null) {
coreEventReg.unregister();
coreEventReg = null;
}
workbook = (IWorkbook) getEditor().getAdapter(IWorkbook.class);
if (workbook != null) {
IMeta meta = workbook.getMeta();
if (meta instanceof ICoreEventSource) {
coreEventReg = ((ICoreEventSource) meta)
.registerCoreEventListener(Core.Metadata, this);
}
}
updateAutoSaveOption();
}
}