/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.propertieseditor;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.*;
import org.eclipse.ui.part.*;
import org.jboss.tools.common.propertieseditor.bundlemodel.*;
public class BundleEditor extends EditorPart {
BundleModel bundleModel = new BundleModel();
BundleLanguagesEditor languages;
BundleLocaleEditor childrenEditor;
private ActivationListener fActivationListener= new ActivationListener();
public BundleEditor() {
bundleModel.addModifiedListener(new BundleModel.ModificationListener() {
public void changed() {
firePropertyChange(PROP_DIRTY);
}
});
}
public void dispose() {
super.dispose();
if(fActivationListener != null && bundleModel != null) {
IWorkbenchWindow window = getSite().getWorkbenchWindow();
window.getPartService().removePartListener(fActivationListener);
window.getShell().removeShellListener(fActivationListener);
}
fActivationListener = null;
if (childrenEditor!=null) childrenEditor.dispose();
childrenEditor = null;
if (bundleModel!=null) {
bundleModel.dispose();
}
bundleModel = null;
if (languages!=null) languages.dispose();
languages = null;
}
public void init(IEditorSite site, IEditorInput input) throws PartInitException {
setSite(site);
setInput(input);
initializeTitle();
IWorkbenchWindow window = getSite().getWorkbenchWindow();
window.getPartService().addPartListener(fActivationListener);
window.getShell().addShellListener(fActivationListener);
}
private void initializeTitle() {
IFile f = getFile();
String title = null;
if(f != null) {
String s = f.getName();
int i = s.lastIndexOf('.');
if(i >= 0) s = s.substring(0, i);
title = "bundle " + s;
} else {
title = getEditorInput().getName();
}
setPartName(title);
setContentDescription(title);
}
private IFile getFile() {
if(getEditorInput() instanceof IFileEditorInput) {
return ((IFileEditorInput)getEditorInput()).getFile();
}
return null;
}
public boolean isDirty() {
return bundleModel.isModified();
}
public void setFocus() {
}
public void createPartControl(Composite parent) {
languages = new BundleLanguagesEditor();
languages.setBundleModel(bundleModel);
childrenEditor = new BundleLocaleEditor();
childrenEditor.setBundleModel(bundleModel);
IEditorInput input = getEditorInput();
if(input instanceof IFileEditorInput) {
IFile f = ((IFileEditorInput)input).getFile();
bundleModel.setMainFile(f);
bundleModel.load();
}
childrenEditor.setObject(bundleModel.getModelObject());
Composite p = new Composite(parent, SWT.NONE);
p.setLayout(new GridLayout());
Control c1 = languages.createControl(p);
c1.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Control c2 = childrenEditor.createControl(p);
c2.setLayoutData(new GridData(GridData.FILL_BOTH));
languages.addListener(childrenEditor);
}
public void doSave(IProgressMonitor monitor) {
bundleModel.save();
}
public void doSaveAs() {}
public void gotoMarker(IMarker marker) {}
public boolean isSaveAsAllowed() {
return false;
}
protected void updateEditableMode() {
if(childrenEditor != null) childrenEditor.update();
}
class ActivationListener extends ShellAdapter implements IPartListener {
private IWorkbenchPart fActivePart;
private boolean fIsHandlingActivation= false;
public void partActivated(IWorkbenchPart part) {
fActivePart= part;
handleActivation();
}
public void partBroughtToTop(IWorkbenchPart part) {}
public void partClosed(IWorkbenchPart part) {}
public void partDeactivated(IWorkbenchPart part) {
fActivePart= null;
}
public void partOpened(IWorkbenchPart part) {}
public void shellActivated(ShellEvent e) {
updateEditableMode();
e.widget.getDisplay().asyncExec(new Runnable() {
public void run() {
handleActivation();
}
});
}
private void handleActivation() {
if (fIsHandlingActivation) return;
if (fActivePart != null && fActivePart.getSite() == getSite()) {
fIsHandlingActivation = true;
try {
doSanityCheckState(getEditorInput());
} finally {
fIsHandlingActivation= false;
}
}
}
};
// private long fModificationStamp= -1;
private boolean fIsSanityCheckEnabled= true;
protected void enableSanityChecking(boolean enable) {
synchronized (this) {
fIsSanityCheckEnabled= enable;
}
}
protected void safelySanityCheckState(IEditorInput input) {
boolean enabled = false;
synchronized (this) {
enabled = fIsSanityCheckEnabled;
}
if (enabled)
doSanityCheckState(input);
}
protected boolean doSanityCheckState(IEditorInput input) {
if (input instanceof IFileEditorInput) {
IFile iFile = ((IFileEditorInput)input).getFile();
if (iFile == null) return false;
/*
File f = (iFile.getLocation() == null ? null : iFile.getLocation().toFile());
if (f == null) return false;
if (fModificationStamp == -1)
fModificationStamp= f.lastModified();
long stamp= f.lastModified();
if (stamp != fModificationStamp) {
fModificationStamp= stamp;
handleEditorInputChanged();
return true;
}
*/
}
return false;
}
}