001/* 002 GRANITE DATA SERVICES 003 Copyright (C) 2011 GRANITE DATA SERVICES S.A.S. 004 005 This file is part of Granite Data Services. 006 007 Granite Data Services is free software; you can redistribute it and/or modify 008 it under the terms of the GNU Library General Public License as published by 009 the Free Software Foundation; either version 2 of the License, or (at your 010 option) any later version. 011 012 Granite Data Services is distributed in the hope that it will be useful, but 013 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 014 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License 015 for more details. 016 017 You should have received a copy of the GNU Library General Public License 018 along with this library; if not, see <http://www.gnu.org/licenses/>. 019*/ 020 021package org.granite.builder.ui; 022 023import java.util.HashSet; 024import java.util.Set; 025 026import org.eclipse.core.runtime.CoreException; 027import org.eclipse.swt.SWT; 028import org.eclipse.swt.events.SelectionAdapter; 029import org.eclipse.swt.events.SelectionEvent; 030import org.eclipse.swt.graphics.Rectangle; 031import org.eclipse.swt.layout.FillLayout; 032import org.eclipse.swt.layout.GridData; 033import org.eclipse.swt.layout.GridLayout; 034import org.eclipse.swt.widgets.Button; 035import org.eclipse.swt.widgets.Composite; 036import org.eclipse.swt.widgets.Label; 037import org.eclipse.swt.widgets.Tree; 038import org.eclipse.swt.widgets.TreeItem; 039import org.granite.builder.GraniteBuilderContext; 040import org.granite.builder.properties.Gas3Template; 041import org.granite.builder.properties.GraniteProperties; 042import org.granite.builder.util.SWTUtil; 043import org.granite.generator.TemplateUri; 044import org.granite.generator.as3.DefaultAs3TypeFactory; 045import org.granite.generator.as3.LCDSAs3TypeFactory; 046import org.granite.generator.as3.reflect.JavaType.Kind; 047import org.granite.generator.template.StandardTemplateUris; 048 049/** 050 * @author Franck WOLFF 051 */ 052public class TemplatesPanel extends Composite { 053 054 private final GraniteProperties properties; 055 056 private Tree templatesTree = null; 057 private boolean initialized = false; 058 059 public TemplatesPanel(Composite parent, GraniteBuilderContext context) throws CoreException { 060 super(parent, SWT.NONE); 061 this.properties = context.getProperties(); 062 initializeComponents(); 063 } 064 065 public Set<Gas3Template> getTemplates() { 066 if (!initialized) 067 return properties.getGas3().getTemplates(); 068 069 Set<Gas3Template> templates = new HashSet<Gas3Template>(templatesTree.getItemCount()); 070 for (TreeItem kindItem : templatesTree.getItems()) { 071 StringBuilder sb = new StringBuilder(); 072 if (kindItem.getItemCount() > 0) 073 sb.append((String)kindItem.getItem(0).getData()); 074 if (kindItem.getItemCount() > 1) 075 sb.append(';').append((String)kindItem.getItem(1).getData()); 076 templates.add(new Gas3Template((Kind)kindItem.getData(), sb.toString())); 077 } 078 return templates; 079 } 080 081 @Override 082 public Rectangle getClientArea() { 083 initializeContent(); 084 return super.getClientArea(); 085 } 086 087 private void initializeContent() { 088 if (!initialized) { 089 for (Kind kind : Kind.values()) { 090 TreeItem kindItem = SWTUtil.addTreeItem(templatesTree, SWTUtil.IMG_TEMPLATE, kind.name(), null, null); 091 kindItem.setData(kind); 092 TemplateUri[] uris = properties.getGas3().getMatchingTemplateUris(kind); 093 for (TemplateUri uri : uris) { 094 TreeItem uriItem = SWTUtil.addTreeItem(kindItem, SWTUtil.IMG_FILE, uri.getUri() + (uri.isBase() ? " (base)" : ""), null, null); 095 uriItem.setData(uri.getUri()); 096 } 097 kindItem.setExpanded(true); 098 } 099 initialized = true; 100 } 101 } 102 103 private void initializeComponents() { 104 setLayout(new GridLayout(2, false)); 105 106 Label text = new Label(this, SWT.NONE); 107 text.setText("Templates used for generation:"); 108 text.setLayoutData(SWTUtil.newGridData(SWT.NONE, 2)); 109 110 templatesTree = new Tree(this, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); 111 templatesTree.setLayoutData(new GridData( 112 GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | 113 GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_VERTICAL 114 )); 115 116 117 Composite buttons = new Composite(this, SWT.NONE); 118 buttons.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING)); 119 buttons.setLayout(new FillLayout(SWT.VERTICAL)); 120 121 final Button editButton = SWTUtil.newButton(buttons, "Edit...", false, new SelectionAdapter() { 122 @Override 123 public void widgetSelected(SelectionEvent e) { 124 editTemplatesHandler(e); 125 } 126 }); 127 128 final Button removeButton = SWTUtil.newButton(buttons, "Remove", false, new SelectionAdapter() { 129 @Override 130 public void widgetSelected(SelectionEvent e) { 131 removeTemplatesHandler(e); 132 } 133 }); 134 135 SWTUtil.newButton(buttons, "Reset to default", true, new SelectionAdapter() { 136 @Override 137 public void widgetSelected(SelectionEvent e) { 138 properties.getGas3().setAs3TypeFactory(DefaultAs3TypeFactory.class.getName()); 139 140 properties.getGas3().getTemplates().clear(); 141 properties.getGas3().getTemplates().addAll(GraniteProperties.getDefaultProperties().getGas3().getTemplates()); 142 143 for (TreeItem item : templatesTree.getItems()) 144 item.dispose(); 145 146 initialized = false; 147 initializeContent(); 148 } 149 }); 150 151 SWTUtil.newButton(buttons, "Use Tide", true, new SelectionAdapter() { 152 @Override 153 public void widgetSelected(SelectionEvent e) { 154 properties.getGas3().setAs3TypeFactory(DefaultAs3TypeFactory.class.getName()); 155 156 Gas3Template template = properties.getGas3().getTemplate(Kind.ENTITY); 157 template.setUri(StandardTemplateUris.ENTITY, false); 158 template.setUri(StandardTemplateUris.TIDE_ENTITY_BASE, true); 159 160 template = properties.getGas3().getTemplate(Kind.REMOTE_DESTINATION); 161 template.setUri(StandardTemplateUris.REMOTE, false); 162 template.setUri(StandardTemplateUris.TIDE_REMOTE_BASE, true); 163 164 template = properties.getGas3().getTemplate(Kind.BEAN); 165 template.setUri(StandardTemplateUris.BEAN, false); 166 template.setUri(StandardTemplateUris.TIDE_BEAN_BASE, true); 167 168 template = properties.getGas3().getTemplate(Kind.ENUM); 169 template.setUri(StandardTemplateUris.ENUM, false); 170 171 for (TreeItem item : templatesTree.getItems()) 172 item.dispose(); 173 174 initialized = false; 175 initializeContent(); 176 } 177 }); 178 179 SWTUtil.newButton(buttons, "Use LCDS", true, new SelectionAdapter() { 180 @Override 181 public void widgetSelected(SelectionEvent e) { 182 properties.getGas3().setAs3TypeFactory(LCDSAs3TypeFactory.class.getName()); 183 184 Gas3Template template = properties.getGas3().getTemplate(Kind.ENTITY); 185 template.setUri(StandardTemplateUris.BEAN, false); 186 template.setUri(StandardTemplateUris.LCDS_BEAN_BASE, true); 187 188 template = properties.getGas3().getTemplate(Kind.REMOTE_DESTINATION); 189 template.setUris(""); 190 191 template = properties.getGas3().getTemplate(Kind.BEAN); 192 template.setUri(StandardTemplateUris.BEAN, false); 193 template.setUri(StandardTemplateUris.LCDS_BEAN_BASE, true); 194 195 template = properties.getGas3().getTemplate(Kind.ENUM); 196 template.setUris(""); 197 198 for (TreeItem item : templatesTree.getItems()) 199 item.dispose(); 200 201 initialized = false; 202 initializeContent(); 203 } 204 }); 205 206 templatesTree.addSelectionListener(new SelectionAdapter() { 207 @Override 208 public void widgetSelected(SelectionEvent e) { 209 // Enable/Disable buttons based on selected tree item. 210 editButton.setEnabled(templatesTree.getSelection() != null && templatesTree.getSelection().length > 0); 211 removeButton.setEnabled(templatesTree.getSelection() != null && templatesTree.getSelection().length > 0); 212 } 213 }); 214 } 215 216 private void editTemplatesHandler(SelectionEvent e) { 217 if (templatesTree.getSelection() == null || templatesTree.getSelection().length == 0) 218 return; 219 220 TreeItem kindItem = templatesTree.getSelection()[0]; 221 while (kindItem.getParentItem() != null) 222 kindItem = kindItem.getParentItem(); 223 224 String templateUri = (kindItem.getItemCount() <= 0 ? "" : (String)kindItem.getItems()[0].getData()); 225 String baseTemplateUri = (kindItem.getItemCount() <= 1 ? "" : (String)kindItem.getItems()[1].getData()); 226 227 String[] uris = Dialogs.editTemplateUris( 228 getDisplay().getActiveShell(), 229 "Templates for " + kindItem.getText() + " type", 230 templateUri, 231 baseTemplateUri 232 ); 233 234 if (uris != null) { 235 if (kindItem.getItemCount() > 0) { 236 kindItem.getItem(0).setText(uris[0]); 237 kindItem.getItem(0).setData(uris[0]); 238 } 239 else { 240 TreeItem uriItem = SWTUtil.addTreeItem(kindItem, SWTUtil.IMG_FILE, uris[0], null, null); 241 uriItem.setData(uris[0]); 242 } 243 244 if (uris[1].length() > 0) { 245 if (kindItem.getItemCount() > 1) { 246 kindItem.getItem(1).setText(uris[1]); 247 kindItem.getItem(1).setData(uris[1]); 248 } 249 else { 250 TreeItem uriItem = SWTUtil.addTreeItem(kindItem, SWTUtil.IMG_FILE, uris[1], null, null); 251 uriItem.setData(uris[1]); 252 } 253 } 254 else if (kindItem.getItemCount() > 1) 255 kindItem.getItem(1).dispose(); 256 } 257 } 258 259 private void removeTemplatesHandler(SelectionEvent e) { 260 if (templatesTree.getSelection() == null || templatesTree.getSelection().length == 0) 261 return; 262 263 TreeItem kindItem = templatesTree.getSelection()[0]; 264 if (kindItem.getParentItem() == null) { 265 for (TreeItem child : kindItem.getItems()) 266 child.dispose(); 267 } 268 else 269 kindItem.dispose(); 270 } 271}