blob: 63a9c03e3c47bcdf4d1ef613491e1423a595fff4 [file] [log] [blame]
amywufe0f3612006-01-25 03:48:57 +00001/*******************************************************************************
2 * Copyright (c) 2005, 2006 IBM Corporation and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 * IBM Corporation - initial API and implementation
10 *******************************************************************************/
nitind65cb13d2005-03-10 23:04:22 +000011package org.eclipse.wst.html.ui.internal.wizard;
12
david_williams9f462582005-04-15 23:38:47 +000013import java.io.ByteArrayInputStream;
14import java.io.ByteArrayOutputStream;
15import java.io.OutputStreamWriter;
nitind65cb13d2005-03-10 23:04:22 +000016import java.util.ArrayList;
17import java.util.Arrays;
18import java.util.List;
19
20import org.eclipse.core.resources.IFile;
amywufe0f3612006-01-25 03:48:57 +000021import org.eclipse.core.resources.IResource;
22import org.eclipse.core.resources.IWorkspace;
23import org.eclipse.core.resources.ResourcesPlugin;
nitind65cb13d2005-03-10 23:04:22 +000024import org.eclipse.core.runtime.IPath;
amywufe0f3612006-01-25 03:48:57 +000025import org.eclipse.core.runtime.IStatus;
david_williams9f462582005-04-15 23:38:47 +000026import org.eclipse.core.runtime.Platform;
27import org.eclipse.core.runtime.Preferences;
28import org.eclipse.core.runtime.content.IContentType;
nitind65cb13d2005-03-10 23:04:22 +000029import org.eclipse.jface.resource.ImageDescriptor;
30import org.eclipse.jface.viewers.IStructuredSelection;
31import org.eclipse.jface.viewers.StructuredSelection;
32import org.eclipse.jface.wizard.Wizard;
david_williams9f462582005-04-15 23:38:47 +000033import org.eclipse.osgi.util.NLS;
nitind65cb13d2005-03-10 23:04:22 +000034import org.eclipse.ui.INewWizard;
35import org.eclipse.ui.IWorkbench;
36import org.eclipse.ui.IWorkbenchPage;
37import org.eclipse.ui.PartInitException;
38import org.eclipse.ui.PlatformUI;
39import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
40import org.eclipse.ui.ide.IDE;
david_williams9f462582005-04-15 23:38:47 +000041import org.eclipse.wst.html.core.internal.HTMLCorePlugin;
amywufe0f3612006-01-25 03:48:57 +000042import org.eclipse.wst.html.core.internal.preferences.HTMLCorePreferenceNames;
david_williams4ad020f2005-04-18 08:00:30 +000043import org.eclipse.wst.html.core.internal.provisional.contenttype.ContentTypeIdForHTML;
david_williams3a2ab2d2005-04-11 16:32:45 +000044import org.eclipse.wst.html.ui.internal.HTMLUIMessages;
nitind65cb13d2005-03-10 23:04:22 +000045import org.eclipse.wst.html.ui.internal.Logger;
david_williams385fc5c2005-06-07 22:34:13 +000046import org.eclipse.wst.html.ui.internal.editor.HTMLEditorPluginImageHelper;
47import org.eclipse.wst.html.ui.internal.editor.HTMLEditorPluginImages;
david_williams9f462582005-04-15 23:38:47 +000048import org.eclipse.wst.sse.core.internal.encoding.CommonEncodingPreferenceNames;
nitind65cb13d2005-03-10 23:04:22 +000049
50public class NewHTMLWizard extends Wizard implements INewWizard {
nitind65cb13d2005-03-10 23:04:22 +000051 private WizardNewFileCreationPage fNewFilePage;
david_williams9f462582005-04-15 23:38:47 +000052 private NewHTMLTemplatesWizardPage fNewFileTemplatesPage;
nitind65cb13d2005-03-10 23:04:22 +000053 private IStructuredSelection fSelection;
amywufe0f3612006-01-25 03:48:57 +000054 private IContentType fContentType;
david_williams9f462582005-04-15 23:38:47 +000055 private List fValidExtensions = null;
56
57 /**
amywufe0f3612006-01-25 03:48:57 +000058 * Adds default extension to the filename
59 *
60 * @param filename
61 * @return
62 */
63 String addDefaultExtension(String filename) {
64 StringBuffer newFileName = new StringBuffer(filename);
65
66 Preferences preference = HTMLCorePlugin.getDefault().getPluginPreferences();
67 String ext = preference.getString(HTMLCorePreferenceNames.DEFAULT_EXTENSION);
68
69 newFileName.append("."); //$NON-NLS-1$
70 newFileName.append(ext);
71
72 return newFileName.toString();
73 }
74
75 /**
76 * Get content type associated with this new file wizard
77 *
78 * @return IContentType
79 */
80 IContentType getContentType() {
81 if (fContentType == null)
82 fContentType = Platform.getContentTypeManager().getContentType(ContentTypeIdForHTML.ContentTypeID_HTML);
83 return fContentType;
84 }
85
86 /**
87 * Get list of valid extensions for HTML Content type
david_williams9f462582005-04-15 23:38:47 +000088 *
89 * @return
90 */
91 List getValidExtensions() {
92 if (fValidExtensions == null) {
amywufe0f3612006-01-25 03:48:57 +000093 IContentType type = getContentType();
david_williams9f462582005-04-15 23:38:47 +000094 fValidExtensions = new ArrayList(Arrays.asList(type.getFileSpecs(IContentType.FILE_EXTENSION_SPEC)));
95 }
96 return fValidExtensions;
97 }
nitind65cb13d2005-03-10 23:04:22 +000098
99 public void addPages() {
david_williams3a2ab2d2005-04-11 16:32:45 +0000100 fNewFilePage = new WizardNewFileCreationPage("HTMLWizardNewFileCreationPage", new StructuredSelection(IDE.computeSelectedResources(fSelection))) { //$NON-NLS-1$
nitind65cb13d2005-03-10 23:04:22 +0000101 protected boolean validatePage() {
amywufe0f3612006-01-25 03:48:57 +0000102 IContentType type = getContentType();
103 String fileName = getFileName();
104 // check that filename does not contain invalid extension
105 if ((fileName.lastIndexOf('.') != -1) && (!type.isAssociatedWith(fileName))) {
david_williams9f462582005-04-15 23:38:47 +0000106 setErrorMessage(NLS.bind(HTMLUIMessages._ERROR_FILENAME_MUST_END_HTML, getValidExtensions().toString()));
nitind65cb13d2005-03-10 23:04:22 +0000107 return false;
108 }
amywufe0f3612006-01-25 03:48:57 +0000109 // no file extension specified so check adding default
110 // extension doesn't equal a file that already exists
111 if (fileName.lastIndexOf('.') == -1) {
112 String newFileName = addDefaultExtension(fileName);
113 IPath resourcePath = getContainerFullPath().append(newFileName);
114
115 IWorkspace workspace = ResourcesPlugin.getWorkspace();
116 IStatus result = workspace.validatePath(resourcePath.toString(), IResource.FOLDER);
117 if (!result.isOK()) {
118 // path invalid
119 setErrorMessage(result.getMessage());
120 return false;
121 }
122
123 if ((workspace.getRoot().getFolder(resourcePath).exists() || workspace.getRoot().getFile(resourcePath).exists())) {
124 setErrorMessage(HTMLUIMessages.ResourceGroup_nameExists);
125 return false;
126 }
127 }
128
nitind65cb13d2005-03-10 23:04:22 +0000129 setErrorMessage(null);
130 return super.validatePage();
131 }
132 };
david_williams3a2ab2d2005-04-11 16:32:45 +0000133 fNewFilePage.setTitle(HTMLUIMessages._UI_WIZARD_NEW_HEADING);
134 fNewFilePage.setDescription(HTMLUIMessages._UI_WIZARD_NEW_DESCRIPTION);
nitind65cb13d2005-03-10 23:04:22 +0000135
136 addPage(fNewFilePage);
amywufe0f3612006-01-25 03:48:57 +0000137
david_williams9f462582005-04-15 23:38:47 +0000138 fNewFileTemplatesPage = new NewHTMLTemplatesWizardPage();
139 addPage(fNewFileTemplatesPage);
nitind65cb13d2005-03-10 23:04:22 +0000140 }
141
142 public void init(IWorkbench aWorkbench, IStructuredSelection aSelection) {
143 fSelection = aSelection;
david_williams3a2ab2d2005-04-11 16:32:45 +0000144 setWindowTitle(HTMLUIMessages._UI_WIZARD_NEW_TITLE);
amywufe0f3612006-01-25 03:48:57 +0000145
david_williams385fc5c2005-06-07 22:34:13 +0000146 ImageDescriptor descriptor = HTMLEditorPluginImageHelper.getInstance().getImageDescriptor(HTMLEditorPluginImages.IMG_WIZBAN_NEWHTMLFILE);
147 setDefaultPageImageDescriptor(descriptor);
nitind65cb13d2005-03-10 23:04:22 +0000148 }
149
150 private void openEditor(final IFile file) {
151 if (file != null) {
152 getShell().getDisplay().asyncExec(new Runnable() {
153 public void run() {
154 try {
155 IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
156 IDE.openEditor(page, file, true);
157 }
158 catch (PartInitException e) {
159 Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
160 }
161 }
162 });
163 }
164 }
165
166 public boolean performFinish() {
amywufe0f3612006-01-25 03:48:57 +0000167 boolean performedOK = false;
david_williams9f462582005-04-15 23:38:47 +0000168 // save user options for next use
169 fNewFileTemplatesPage.saveLastSavedPreferences();
170
amywufe0f3612006-01-25 03:48:57 +0000171 // no file extension specified so add default extension
172 String fileName = fNewFilePage.getFileName();
173 if (fileName.lastIndexOf('.') == -1) {
174 String newFileName = addDefaultExtension(fileName);
175 fNewFilePage.setFileName(newFileName);
176 }
177
david_williams9f462582005-04-15 23:38:47 +0000178 // create a new empty file
nitind65cb13d2005-03-10 23:04:22 +0000179 IFile file = fNewFilePage.createNewFile();
david_williams9f462582005-04-15 23:38:47 +0000180
amywufe0f3612006-01-25 03:48:57 +0000181 // if there was problem with creating file, it will be null, so make
182 // sure to check
183 if (file != null) {
184 // put template contents into file
185 String templateString = fNewFileTemplatesPage.getTemplateString();
186 if (templateString != null) {
187 // determine the encoding for the new file
188 Preferences preference = HTMLCorePlugin.getDefault().getPluginPreferences();
189 String charSet = preference.getString(CommonEncodingPreferenceNames.OUTPUT_CODESET);
david_williams9f462582005-04-15 23:38:47 +0000190
amywufe0f3612006-01-25 03:48:57 +0000191 try {
192 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
193 OutputStreamWriter outputStreamWriter = null;
194 if (charSet == null || charSet.trim().equals("")) { //$NON-NLS-1$
195 // just use default encoding
196 outputStreamWriter = new OutputStreamWriter(outputStream);
197 }
198 else {
199 outputStreamWriter = new OutputStreamWriter(outputStream, charSet);
200 }
201 outputStreamWriter.write(templateString);
202 outputStreamWriter.flush();
203 outputStreamWriter.close();
204 ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
205 file.setContents(inputStream, true, false, null);
206 inputStream.close();
david_williams9f462582005-04-15 23:38:47 +0000207 }
amywufe0f3612006-01-25 03:48:57 +0000208 catch (Exception e) {
209 Logger.log(Logger.WARNING_DEBUG, "Could not create contents for new HTML file", e); //$NON-NLS-1$
210 }
david_williams9f462582005-04-15 23:38:47 +0000211 }
david_williams9f462582005-04-15 23:38:47 +0000212
amywufe0f3612006-01-25 03:48:57 +0000213 // open the file in editor
214 openEditor(file);
215
216 // everything's fine
217 performedOK = true;
218 }
219 return performedOK;
nitind65cb13d2005-03-10 23:04:22 +0000220 }
221}