diff -r 4d198a32ac7d -r d4809db37847 plugins/org.symbian.tools.tmw.previewer/src/org/symbian/tools/tmw/previewer/preview/AbstractPreviewPage.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/org.symbian.tools.tmw.previewer/src/org/symbian/tools/tmw/previewer/preview/AbstractPreviewPage.java Thu Aug 19 17:48:04 2010 -0700 @@ -0,0 +1,230 @@ +package org.symbian.tools.tmw.previewer.preview; + +import java.net.URI; +import java.util.Collection; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.IPath; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.ISelectionProvider; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.swt.browser.Browser; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.ui.actions.ActionFactory; +import org.eclipse.ui.part.IPageSite; +import org.eclipse.ui.part.Page; +import org.symbian.tools.tmw.core.utilities.CoreUtil; +import org.symbian.tools.tmw.previewer.Images; +import org.symbian.tools.tmw.previewer.PreviewerPlugin; + +public abstract class AbstractPreviewPage extends Page implements IPreviewPage, + ISelectionProvider { + private final IAction refreshAction = new Action("Refresh") { + public void run() { + refresh(true); + }; + }; + private final IAction toggleRefresh = new Action("Toggle Refresh", + IAction.AS_RADIO_BUTTON) { + public void run() { + toggleRefresh(); + }; + }; + + protected IProject project; + private Browser browser; + private boolean toggleState = true; + private final PreviewView previewView; + private boolean needsRefresh = false; + + public AbstractPreviewPage(IProject project, PreviewView previewView) { + this.project = project; + this.previewView = previewView; + } + + protected void toggleRefresh() { + toggleState = !toggleState; + toggleRefresh.setChecked(toggleState); + previewView.setProjectAutorefresh(project, toggleState); + toggleRefresh.setToolTipText(getToggleActionTooltip()); + if (toggleState && needsRefresh) { + refresh(true); + } + } + + @Override + public void createControl(Composite parent) { + browser = createBrowser(parent); + browser.setLayoutData(new GridData(GridData.FILL_BOTH)); + browser.setUrl(getURI().toASCIIString()); + } + + protected abstract Browser createBrowser(Composite parent); + + private URI getURI() { + return PreviewerPlugin.getDefault().getHttpPreviewer().previewProject( + project, null); + } + + @Override + public Control getControl() { + return browser; + } + + @Override + public void setFocus() { + if (browser != null && !browser.isDisposed()) { + browser.setFocus(); + } + } + + private boolean refreshScheduled = false; + + public synchronized void process(Collection files) { + if (!isDisposed() && !refreshScheduled && needsRefresh(files)) { + asyncExec(new Runnable() { + public void run() { + refreshBrowser(); + } + }); + refreshScheduled = true; + } + } + + protected void promptIfNeeded() { + if (toggleState) { + toggleState = previewView.promptUserToToggle(project, toggleState); + toggleRefresh.setChecked(toggleState); + } + } + + private void asyncExec(Runnable runnable) { + getControl().getDisplay().asyncExec(runnable); + } + + private boolean needsRefresh(Collection files) { + for (IFile iFile : files) { + if (iFile.getProject().equals(project)) { + return true; + } + } + return false; + } + + protected synchronized void refresh(final boolean manual) { + try { + if (!isDisposed()) { + final Control focusControl = browser.getDisplay() + .getFocusControl(); + if (manual && CoreUtil.isMac()) { + browser.getParent().forceFocus(); + } + browser.setUrl(getURI().toASCIIString()); + refreshAction.setImageDescriptor(PreviewerPlugin + .getImageDescriptor(Images.GREEN_SYNC)); + asyncExec(new Runnable() { + public void run() { + if (!manual && focusControl != null) { + focusControl.setFocus(); + } else if (manual) { + browser.forceFocus(); + } + } + }); + refreshAction.setToolTipText("Refresh the preview browser"); + } + needsRefresh = false; + } finally { + refreshScheduled = false; + } + } + + @Override + public void init(IPageSite pageSite) { + super.init(pageSite); + IToolBarManager toolBar = pageSite.getActionBars().getToolBarManager(); + + contributeToToolbar(toolBar); + + refreshAction.setImageDescriptor(PreviewerPlugin + .getImageDescriptor(Images.GREEN_SYNC)); + refreshAction.setToolTipText("Refresh the preview browser"); + toolBar.add(refreshAction); + + toggleState = previewView.getProjectAutorefresh(project); + + toggleRefresh.setImageDescriptor(PreviewerPlugin + .getImageDescriptor(Images.YELLOW_SYNC)); + toggleRefresh.setToolTipText(getToggleActionTooltip()); + toggleRefresh.setChecked(toggleState); + toolBar.add(toggleRefresh); + + pageSite.getActionBars().setGlobalActionHandler( + ActionFactory.REFRESH.getId(), refreshAction); + getSite().setSelectionProvider(this); + } + + protected void contributeToToolbar(IToolBarManager toolBar) { + // Do nothing here + } + + private String getToggleActionTooltip() { + return toggleState ? "Disable preview autorefresh" + : "Enable preview autorefresh"; + } + + public void addSelectionChangedListener(ISelectionChangedListener listener) { + // Do nothing + } + + public ISelection getSelection() { + return new StructuredSelection(project); + } + + public void removeSelectionChangedListener( + ISelectionChangedListener listener) { + // Do nothing + } + + public void setSelection(ISelection selection) { + // Do nothing + } + + public boolean isDisposed() { + return browser != null && browser.isDisposed(); + } + + private synchronized void refreshBrowser() { + if (toggleState) { + promptIfNeeded(); + } + if (toggleState) { + refresh(false); + } else { + needsRefresh = true; + refreshAction.setImageDescriptor(PreviewerPlugin + .getImageDescriptor(Images.RED_SYNC)); + refreshAction + .setToolTipText("Refresh the preview browser (there are updated files)"); + } + } + + public IProject getProject() { + return project; + } + + public synchronized void projectRenamed(IPath newPath) { + if (!isDisposed()) { + project = ResourcesPlugin.getWorkspace().getRoot().getProject( + newPath.lastSegment()); + } + } +}