org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/preview/AbstractPreviewPage.java
changeset 301 a908b05787d1
parent 288 351bff9a265b
child 304 d92630dec325
equal deleted inserted replaced
300:9505af44d7bf 301:a908b05787d1
     3 import java.net.URI;
     3 import java.net.URI;
     4 import java.util.Collection;
     4 import java.util.Collection;
     5 
     5 
     6 import org.eclipse.core.resources.IFile;
     6 import org.eclipse.core.resources.IFile;
     7 import org.eclipse.core.resources.IProject;
     7 import org.eclipse.core.resources.IProject;
       
     8 import org.eclipse.core.resources.ResourcesPlugin;
       
     9 import org.eclipse.core.runtime.IPath;
     8 import org.eclipse.jface.action.Action;
    10 import org.eclipse.jface.action.Action;
     9 import org.eclipse.jface.action.IAction;
    11 import org.eclipse.jface.action.IAction;
    10 import org.eclipse.jface.action.IToolBarManager;
    12 import org.eclipse.jface.action.IToolBarManager;
    11 import org.eclipse.jface.viewers.ISelection;
    13 import org.eclipse.jface.viewers.ISelection;
    12 import org.eclipse.jface.viewers.ISelectionChangedListener;
    14 import org.eclipse.jface.viewers.ISelectionChangedListener;
    13 import org.eclipse.jface.viewers.ISelectionProvider;
    15 import org.eclipse.jface.viewers.ISelectionProvider;
    14 import org.eclipse.jface.viewers.StructuredSelection;
    16 import org.eclipse.jface.viewers.StructuredSelection;
       
    17 import org.eclipse.swt.SWT;
    15 import org.eclipse.swt.browser.Browser;
    18 import org.eclipse.swt.browser.Browser;
       
    19 import org.eclipse.swt.layout.GridData;
       
    20 import org.eclipse.swt.layout.GridLayout;
    16 import org.eclipse.swt.widgets.Composite;
    21 import org.eclipse.swt.widgets.Composite;
    17 import org.eclipse.swt.widgets.Control;
    22 import org.eclipse.swt.widgets.Control;
    18 import org.eclipse.ui.actions.ActionFactory;
    23 import org.eclipse.ui.actions.ActionFactory;
    19 import org.eclipse.ui.part.IPageSite;
    24 import org.eclipse.ui.part.IPageSite;
    20 import org.eclipse.ui.part.Page;
    25 import org.eclipse.ui.part.Page;
    21 import org.symbian.tools.wrttools.previewer.Images;
    26 import org.symbian.tools.wrttools.previewer.Images;
    22 import org.symbian.tools.wrttools.previewer.PreviewerPlugin;
    27 import org.symbian.tools.wrttools.previewer.PreviewerPlugin;
    23 
    28 
    24 public abstract class AbstractPreviewPage extends Page implements IPreviewPage, ISelectionProvider {
    29 public abstract class AbstractPreviewPage extends Page implements IPreviewPage, ISelectionProvider {
    25 	private final IAction refreshAction = new Action("Refresh") {
    30     private final IAction refreshAction = new Action("Refresh") {
    26 		public void run() {
    31         public void run() {
    27 			refresh(true);
    32             refresh(true);
    28 		};
    33         };
    29 	};
    34     };
    30 	private final IAction toggleRefresh = new Action("Toggle Refresh", IAction.AS_RADIO_BUTTON) {
    35     private final IAction toggleRefresh = new Action("Toggle Refresh", IAction.AS_RADIO_BUTTON) {
    31 		public void run() {
    36         public void run() {
    32 			toggleRefresh();
    37             toggleRefresh();
    33 		};
    38         };
    34 	};
    39     };
    35 
    40 
    36     protected final IProject project;
    41     protected IProject project;
    37 	private Browser browser;
    42     private Browser browser;
    38 	private boolean toggleState = true;
    43     private boolean toggleState = true;
    39 	private final PreviewView previewView;
    44     private final PreviewView previewView;
    40 	private boolean needsRefresh = false;
    45     private boolean needsRefresh = false;
    41 
    46     private Composite pane;
    42 	public AbstractPreviewPage(IProject project, PreviewView previewView) {
    47 
    43 		this.project = project;
    48     public AbstractPreviewPage(IProject project, PreviewView previewView) {
    44 		this.previewView = previewView;
    49         this.project = project;
    45 	}
    50         this.previewView = previewView;
    46 
    51     }
    47 	protected void toggleRefresh() {
    52 
    48 		toggleState = !toggleState;
    53     protected void toggleRefresh() {
    49 		toggleRefresh.setChecked(toggleState);
    54         toggleState = !toggleState;
    50 		previewView.setProjectAutorefresh(project, toggleState);
    55         toggleRefresh.setChecked(toggleState);
    51 		toggleRefresh.setToolTipText(getToggleActionTooltip());
    56         previewView.setProjectAutorefresh(project, toggleState);
    52 		if (toggleState && needsRefresh) {
    57         toggleRefresh.setToolTipText(getToggleActionTooltip());
    53 			refresh(true);
    58         if (toggleState && needsRefresh) {
    54 		}
    59             refresh(true);
    55 	}
    60         }
    56 
    61     }
    57 	
    62 
    58 	@Override
    63     @Override
    59 	public void createControl(Composite parent) {
    64     public void createControl(Composite parent) {
    60 		browser = createBrowser(parent);
    65         pane = new Composite(parent, SWT.EMBEDDED);
    61 		browser.setUrl(getURI().toASCIIString());
    66         GridLayout layout = new GridLayout();
    62 	}
    67         layout.marginWidth = 0;
    63 
    68         layout.marginHeight = 0;
    64 	protected abstract Browser createBrowser(Composite parent);
    69         pane.setLayout(layout);
    65 
    70         addBrowser();
    66 	private URI getURI() {
    71     }
    67 		return PreviewerPlugin.getDefault().getHttpPreviewer().previewProject(project);
    72 
    68 	}
    73     private void addBrowser() {
    69 
    74         browser = createBrowser(pane);
    70 	@Override
    75         browser.setLayoutData(new GridData(GridData.FILL_BOTH));
    71 	public Control getControl() {
    76         browser.setUrl(getURI().toASCIIString());
    72 		return browser;
    77         pane.layout();
    73 	}
    78     }
    74 
    79 
    75 	@Override
    80     protected abstract Browser createBrowser(Composite parent);
    76 	public void setFocus() {
    81 
    77 		if (browser != null && !browser.isDisposed()) {
    82     private URI getURI() {
    78 			browser.setFocus();
    83         return PreviewerPlugin.getDefault().getHttpPreviewer().previewProject(project);
    79 		}
    84     }
    80 	}
    85 
    81 	
    86     @Override
    82 	private boolean refreshScheduled = false;
    87     public Control getControl() {
    83 
    88         return pane;
    84 	public synchronized void process(Collection<IFile> files) {
    89     }
    85 		if (!refreshScheduled && needsRefresh(files)) {
    90 
    86 			asyncExec(new Runnable() {
    91     @Override
    87 				public void run() {
    92     public void setFocus() {
    88 					refreshBrowser();
    93         if (browser != null && !browser.isDisposed()) {
    89 				}
    94             browser.setFocus();
    90 			});
    95         }
    91 			refreshScheduled = true;
    96     }
    92 		}
    97 
    93 	}
    98     private boolean refreshScheduled = false;
    94 
    99 
    95 	protected void promptIfNeeded() {
   100     public synchronized void process(Collection<IFile> files) {
    96 		if (toggleState) {
   101         if (!refreshScheduled && needsRefresh(files)) {
    97 			toggleState = previewView.promptUserToToggle(project, toggleState);
   102             asyncExec(new Runnable() {
    98 			toggleRefresh.setChecked(toggleState);
   103                 public void run() {
    99 		}
   104                     refreshBrowser();
   100 	}
   105                 }
   101 
   106             });
   102 	private void asyncExec(Runnable runnable) {
   107             refreshScheduled = true;
   103 		getControl().getDisplay().asyncExec(runnable);
   108         }
   104 	}
   109     }
   105 
   110 
   106 	private boolean needsRefresh(Collection<IFile> files) {
   111     protected void promptIfNeeded() {
   107 		for (IFile iFile : files) {
   112         if (toggleState) {
   108 			if (iFile.getProject().equals(project)) {
   113             toggleState = previewView.promptUserToToggle(project, toggleState);
   109 				return true;
   114             toggleRefresh.setChecked(toggleState);
   110 			}
   115         }
   111 		}
   116     }
   112 		return false;
   117 
   113 	}
   118     private void asyncExec(Runnable runnable) {
   114 
   119         getControl().getDisplay().asyncExec(runnable);
   115 	protected synchronized void refresh(boolean manual) {
   120     }
   116 		try {
   121 
   117 			if (!browser.isDisposed()) {
   122     private boolean needsRefresh(Collection<IFile> files) {
   118 				final Control focusControl = browser.getDisplay().getFocusControl();
   123         for (IFile iFile : files) {
   119 				browser.refresh();
   124             if (iFile.getProject().equals(project)) {
   120 				refreshAction.setImageDescriptor(PreviewerPlugin.getImageDescriptor(Images.GREEN_SYNC));
   125                 return true;
   121 				if (!manual && focusControl != null) {
   126             }
   122 					asyncExec(new Runnable() {
   127         }
   123 						public void run() {
   128         return false;
   124 							focusControl.setFocus();
   129     }
   125 						}
   130 
   126 					});
   131     protected synchronized void refresh(boolean manual) {
   127 				}
   132         try {
   128 				refreshAction.setToolTipText("Refresh the preview browser");
   133             if (!isDisposed()) {
   129 			}
   134                 final Control focusControl = browser.getDisplay().getFocusControl();
   130 			needsRefresh = false;
   135                 browser.refresh();
   131 		} finally {
   136                 refreshAction.setImageDescriptor(PreviewerPlugin.getImageDescriptor(Images.GREEN_SYNC));
   132 			refreshScheduled = false;
   137                 if (!manual && focusControl != null) {
   133 		}
   138                     asyncExec(new Runnable() {
   134 	}
   139                         public void run() {
   135 
   140                             focusControl.setFocus();
   136 	@Override
   141                         }
   137 	public void init(IPageSite pageSite) {
   142                     });
   138 		super.init(pageSite);
   143                 }
   139 		IToolBarManager toolBar = pageSite.getActionBars().getToolBarManager();
   144                 refreshAction.setToolTipText("Refresh the preview browser");
       
   145             }
       
   146             needsRefresh = false;
       
   147         } finally {
       
   148             refreshScheduled = false;
       
   149         }
       
   150     }
       
   151 
       
   152     @Override
       
   153     public void init(IPageSite pageSite) {
       
   154         super.init(pageSite);
       
   155         IToolBarManager toolBar = pageSite.getActionBars().getToolBarManager();
   140 
   156 
   141         contributeToToolbar(toolBar);
   157         contributeToToolbar(toolBar);
   142 
   158 
   143 		refreshAction.setImageDescriptor(PreviewerPlugin.getImageDescriptor(Images.GREEN_SYNC));
   159         refreshAction.setImageDescriptor(PreviewerPlugin.getImageDescriptor(Images.GREEN_SYNC));
   144 		refreshAction.setToolTipText("Refresh the preview browser");
   160         refreshAction.setToolTipText("Refresh the preview browser");
   145 		toolBar.add(refreshAction);
   161         toolBar.add(refreshAction);
   146 		
   162 
   147 		toggleState = previewView.getProjectAutorefresh(project);
   163         toggleState = previewView.getProjectAutorefresh(project);
   148 		
   164 
   149 		toggleRefresh.setImageDescriptor(PreviewerPlugin.getImageDescriptor(Images.YELLOW_SYNC));
   165         toggleRefresh.setImageDescriptor(PreviewerPlugin.getImageDescriptor(Images.YELLOW_SYNC));
   150 		toggleRefresh.setToolTipText(getToggleActionTooltip());
   166         toggleRefresh.setToolTipText(getToggleActionTooltip());
   151 		toggleRefresh.setChecked(toggleState);
   167         toggleRefresh.setChecked(toggleState);
   152 		toolBar.add(toggleRefresh);
   168         toolBar.add(toggleRefresh);
   153 		
   169 
   154 		pageSite.getActionBars().setGlobalActionHandler(ActionFactory.REFRESH.getId(), refreshAction);
   170         pageSite.getActionBars().setGlobalActionHandler(ActionFactory.REFRESH.getId(), refreshAction);
   155 		getSite().setSelectionProvider(this);
   171         getSite().setSelectionProvider(this);
   156 	}
   172     }
   157 
   173 
   158     protected void contributeToToolbar(IToolBarManager toolBar) {
   174     protected void contributeToToolbar(IToolBarManager toolBar) {
   159         // Do nothing here
   175         // Do nothing here
   160     }
   176     }
   161 
   177 
   162     private String getToggleActionTooltip() {
   178     private String getToggleActionTooltip() {
   163 		return toggleState ? "Disable preview autorefresh" : "Enable preview autorefresh";
   179         return toggleState ? "Disable preview autorefresh" : "Enable preview autorefresh";
   164 	}
   180     }
   165 
   181 
   166 	public void addSelectionChangedListener(ISelectionChangedListener listener) {
   182     public void addSelectionChangedListener(ISelectionChangedListener listener) {
   167 		// Do nothing
   183         // Do nothing
   168 	}
   184     }
   169 
   185 
   170 	public ISelection getSelection() {
   186     public ISelection getSelection() {
   171 		return new StructuredSelection(project);
   187         return new StructuredSelection(project);
   172 	}
   188     }
   173 
   189 
   174 	public void removeSelectionChangedListener(
   190     public void removeSelectionChangedListener(ISelectionChangedListener listener) {
   175 			ISelectionChangedListener listener) {
   191         // Do nothing
   176 		// Do nothing
   192     }
   177 	}
   193 
   178 
   194     public void setSelection(ISelection selection) {
   179 	public void setSelection(ISelection selection) {
   195         // Do nothing
   180 		// Do nothing
   196     }
   181 	}
   197 
   182 
   198     public boolean isDisposed() {
   183 	public boolean isDisposed() {
   199         return browser != null && browser.isDisposed();
   184 		return browser != null && browser.isDisposed();
   200     }
   185 	}
   201 
   186 
   202     private synchronized void refreshBrowser() {
   187 	private synchronized void refreshBrowser() {
   203         if (toggleState) {
   188 		if (toggleState) {
   204             promptIfNeeded();
   189 			promptIfNeeded();
   205         }
   190 		}
   206         if (toggleState) {
   191 		if (toggleState) {
   207             refresh(false);
   192 			refresh(false);
   208         } else {
   193 		} else {
   209             needsRefresh = true;
   194 			needsRefresh = true;
   210             refreshAction.setImageDescriptor(PreviewerPlugin.getImageDescriptor(Images.RED_SYNC));
   195 			refreshAction.setImageDescriptor(PreviewerPlugin.getImageDescriptor(Images.RED_SYNC));
   211             refreshAction.setToolTipText("Refresh the preview browser (there are updated files)");
   196 			refreshAction.setToolTipText("Refresh the preview browser (there are updated files)");
   212         }
   197 		}
   213     }
   198 	}
   214 
       
   215     public IProject getProject() {
       
   216         return project;
       
   217     }
       
   218 
       
   219     public synchronized void projectRenamed(IPath newPath) {
       
   220         project = ResourcesPlugin.getWorkspace().getRoot().getProject(newPath.lastSegment());
       
   221         asyncExec(new Runnable() {
       
   222             public void run() {
       
   223                 browser.dispose();
       
   224                 addBrowser();
       
   225             }
       
   226         });
       
   227     }
   199 }
   228 }