blob: 5546c151fc3bd8979fae94cb17a067b6d6d6df31 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.apisupport.project.ui.wizard.html;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.netbeans.api.project.Project;
import org.netbeans.api.templates.TemplateRegistration;
import org.netbeans.modules.apisupport.project.api.UIUtil;
import org.netbeans.modules.apisupport.project.api.Util;
import org.netbeans.modules.apisupport.project.spi.NbModuleProvider;
import org.netbeans.modules.apisupport.project.ui.wizard.common.BasicWizardIterator;
import org.netbeans.modules.apisupport.project.ui.wizard.common.CreatedModifiedFiles;
import org.openide.WizardDescriptor;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileSystem;
import org.openide.filesystems.FileUtil;
import org.openide.modules.SpecificationVersion;
import org.openide.util.NbBundle.Messages;
/**
* Wizard for creating new HTML based UI.
*
* @author Jaroslav Tulach
*/
@TemplateRegistration(
folder=UIUtil.TEMPLATE_FOLDER,
id="newHTML",
position=191,
displayName="#template_html",
iconBase="org/netbeans/modules/apisupport/project/ui/wizard/html/newHTML.png",
description="newHTML.html",
category=UIUtil.TEMPLATE_CATEGORY
)
@Messages("template_html=Portable HTML UI")
public final class HTMLIterator extends BasicWizardIterator {
private HTMLIterator.DataModel data;
@Override
public Set instantiate() throws IOException {
CreatedModifiedFiles cmf = data.getCreatedModifiedFiles();
cmf.run();
return getCreatedFiles(cmf, data.getProject());
}
@Override
protected BasicWizardIterator.Panel[] createPanels(WizardDescriptor wiz) {
data = new HTMLIterator.DataModel(wiz);
return new BasicWizardIterator.Panel[] {
new NameAndLocationPanel(wiz, data)
};
}
public @Override void uninitialize(WizardDescriptor wiz) {
super.uninitialize(wiz);
data = null;
}
static final class DataModel extends BasicWizardIterator.BasicDataModel {
private String name;
private String icon;
private String mode;
private boolean opened = false;
private boolean keepPrefSize = false;
private boolean slidingNotAllowed = false;
private boolean closingNotAllowed = false;
private boolean draggingNotAllowed = false;
private boolean undockingNotAllowed = false;
private boolean maximizationNotAllowed = false;
private Map<String,String> newModes;
private Set<String> existingModes;
private boolean ignorePreviousRun = true;
private CreatedModifiedFiles files;
FileSystem sfs;
DataModel(WizardDescriptor wiz) {
super(wiz);
}
public CreatedModifiedFiles getCreatedModifiedFiles() {
return getFiles();
}
public void setCreatedModifiedFiles(CreatedModifiedFiles files) {
this.setFiles(files);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public CreatedModifiedFiles getFiles() {
return files;
}
public void setFiles(CreatedModifiedFiles files) {
this.files = files;
}
public String getIcon() {
return icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
public String getMode() {
return mode;
}
public void defineMode(String name, String definition) {
if (newModes == null) {
newModes = new TreeMap<String, String>();
}
newModes.put(name, definition);
}
void existingMode(String name) {
if (existingModes == null) {
existingModes = new TreeSet<String>();
}
existingModes.add(name);
}
boolean isExistingMode(String name) {
return existingModes != null && existingModes.contains(name);
}
Map<String,String> getNewModes() {
if (newModes == null) {
return null;
}
TreeMap<String,String> copy = new TreeMap<String,String>(newModes);
if (existingModes != null) {
copy.keySet().removeAll(existingModes);
}
return copy.isEmpty() ? null : copy;
}
public boolean isIgnorePreviousRun() {
return ignorePreviousRun;
}
public void setIgnorePreviousRun(boolean ignorePreviousRun) {
this.ignorePreviousRun = ignorePreviousRun;
}
public void setMode(String mode) {
this.mode = mode;
}
public boolean isOpened() {
return opened;
}
public void setOpened(boolean opened) {
this.opened = opened;
}
public boolean isKeepPrefSize() {
return keepPrefSize;
}
public void setKeepPrefSize(boolean keepPrefSize) {
this.keepPrefSize = keepPrefSize;
}
public boolean isClosingNotAllowed() {
return closingNotAllowed;
}
public void setClosingNotAllowed(boolean closingNotAllowed) {
this.closingNotAllowed = closingNotAllowed;
}
public boolean isDraggingNotAllowed() {
return draggingNotAllowed;
}
public void setDraggingNotAllowed(boolean draggingNotAllowed) {
this.draggingNotAllowed = draggingNotAllowed;
}
public boolean isMaximizationNotAllowed() {
return maximizationNotAllowed;
}
public void setMaximizationNotAllowed(boolean maximizationNotAllowed) {
this.maximizationNotAllowed = maximizationNotAllowed;
}
public boolean isSlidingNotAllowed() {
return slidingNotAllowed;
}
public void setSlidingNotAllowed(boolean slidingNotAllowed) {
this.slidingNotAllowed = slidingNotAllowed;
}
public boolean isUndockingNotAllowed() {
return undockingNotAllowed;
}
public void setUndockingNotAllowed(boolean undockingNotAllowed) {
this.undockingNotAllowed = undockingNotAllowed;
}
void setSFS(FileSystem sfs) {
this.sfs = sfs;
}
}
static void generateFileChanges(final DataModel model) {
CreatedModifiedFiles fileChanges = new CreatedModifiedFiles(model.getProject());
Project project = model.getProject();
NbModuleProvider moduleInfo = model.getModuleInfo();
final String name = model.getName();
final String packageName = model.getPackageName();
final String mode = model.getMode();
try {
SpecificationVersion current = model.getModuleInfo().getDependencyVersion("org.netbeans.api.htmlui");
} catch (IOException ex) {
Logger.getLogger(HTMLIterator.class.getName()).log(Level.INFO, null, ex);
}
if (name != null) {
Map<String,String> replaceTokens = new HashMap<String,String>();
replaceTokens.put("TEMPLATENAME", name);//NOI18N
replaceTokens.put("PACKAGENAME", packageName);//NOI18N
// 0. move icon file if necessary
String icon = model.getIcon();
File fil = null;
if (icon != null) {
fil = new File(icon);
if (!fil.exists()) {
fil = null;
}
}
// XXX this should be using addCreateIconOperation
String relativeIconPath = null;
if (fil != null) {
FileObject fo = FileUtil.toFileObject(fil);
if (!FileUtil.isParentOf(Util.getResourceDirectory(project), fo)) {
String iconPath = getRelativePath(moduleInfo.getResourceDirectoryPath(false), packageName,
"", fo.getNameExt()); //NOI18N
fileChanges.add(fileChanges.createFile(iconPath, fo));
relativeIconPath = packageName.replace('.', '/') + "/" + fo.getNameExt(); // NOI18N
} else {
relativeIconPath = FileUtil.getRelativePath(Util.getResourceDirectory(project), fo);
}
replaceTokens.put("ICONPATH", relativeIconPath);//NOI18N
replaceTokens.put("COMMENTICON", "");//NOI18N
} else {
replaceTokens.put("ICONPATH", "SET/PATH/TO/ICON/HERE"); //NOI18N
replaceTokens.put("COMMENTICON", "//");//NOI18N
}
// 2. update project dependencies
replaceTokens.put("MODULENAME", moduleInfo.getCodeNameBase()); // NOI18N
String specVersion = moduleInfo.getSpecVersion();
replaceTokens.put("SPECVERSION", specVersion != null ? specVersion : "0"); // NOI18N
fileChanges.add(fileChanges.addModuleDependency("org.netbeans.api.htmlui")); //NOI18N
fileChanges.add(fileChanges.addModuleDependency("net.java.html")); //NOI18N
fileChanges.add(fileChanges.addModuleDependency("net.java.html.json")); //NOI18N
fileChanges.add(fileChanges.addModuleDependency("net.java.html.js")); //NOI18N
fileChanges.add(fileChanges.addModuleDependency("org.openide.util")); //NOI18N
fileChanges.add(fileChanges.addModuleDependency("org.openide.awt")); //NOI18N
// x. generate java classes
final String tcName = getRelativePath(moduleInfo.getSourceDirectoryPath(), packageName,
name, "Cntrl.java"); //NOI18N
FileObject template = CreatedModifiedFiles.getTemplate(
"HTML.java"
);
fileChanges.add(fileChanges.createFileWithSubstitutions(tcName, template, replaceTokens));
// x. generate java classes
final String tcFormName = getRelativePath(moduleInfo.getSourceDirectoryPath(), packageName,
name, ".html"); //NOI18N
template = CreatedModifiedFiles.getTemplate("HTML.html");//NOI18N
fileChanges.add(fileChanges.createFileWithSubstitutions(tcFormName, template, replaceTokens));
}
model.setCreatedModifiedFiles(fileChanges);
}
private static String getRelativePath(String rootpath, String fullyQualifiedPackageName,
String prefix, String postfix) {
StringBuilder sb = new StringBuilder();
sb.append(rootpath).append('/').append(fullyQualifiedPackageName.replace('.','/'))
.append('/').append(prefix).append(postfix);
return sb.toString();
}
}