LanternaBuilderCustomizer.java
001 /*
002  * Copyright 2008-2016 the original author or authors.
003  *
004  * Licensed under the Apache License, Version 2.0 (the "License");
005  * you may not use this file except in compliance with the License.
006  * You may obtain a copy of the License at
007  *
008  *     http://www.apache.org/licenses/LICENSE-2.0
009  *
010  * Unless required by applicable law or agreed to in writing, software
011  * distributed under the License is distributed on an "AS IS" BASIS,
012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013  * See the License for the specific language governing permissions and
014  * limitations under the License.
015  */
016 package griffon.builder.lanterna;
017 
018 import com.googlecode.lanterna.gui.Component;
019 import com.googlecode.lanterna.gui.component.Panel;
020 import com.googlecode.lanterna.gui.layout.BorderLayout;
021 import com.googlecode.lanterna.gui.layout.HorisontalLayout;
022 import com.googlecode.lanterna.gui.layout.VerticalLayout;
023 import griffon.builder.lanterna.factory.ActionFactory;
024 import griffon.builder.lanterna.factory.ActionListBoxFactory;
025 import griffon.builder.lanterna.factory.ApplicationFactory;
026 import griffon.builder.lanterna.factory.BoxFactory;
027 import griffon.builder.lanterna.factory.ButtonFactory;
028 import griffon.builder.lanterna.factory.CheckBoxFactory;
029 import griffon.builder.lanterna.factory.CollectionFactory;
030 import griffon.builder.lanterna.factory.ComponentFactory;
031 import griffon.builder.lanterna.factory.EmptySpaceFactory;
032 import griffon.builder.lanterna.factory.LabelFactory;
033 import griffon.builder.lanterna.factory.LayoutFactory;
034 import griffon.builder.lanterna.factory.PanelFactory;
035 import griffon.builder.lanterna.factory.PasswordBoxFactory;
036 import griffon.builder.lanterna.factory.ProgressBarFactory;
037 import griffon.builder.lanterna.factory.TableFactory;
038 import griffon.builder.lanterna.factory.TextAreaFactory;
039 import griffon.builder.lanterna.factory.TextBoxFactory;
040 import griffon.inject.DependsOn;
041 import groovy.lang.Closure;
042 import groovy.util.Factory;
043 import groovy.util.FactoryBuilderSupport;
044 import org.codehaus.griffon.runtime.groovy.view.AbstractBuilderCustomizer;
045 
046 import javax.inject.Named;
047 import java.util.LinkedHashMap;
048 import java.util.Map;
049 
050 import static griffon.util.CollectionUtils.newList;
051 
052 /**
053  @author Andres Almiray
054  @since 2.0.0
055  */
056 @Named("lanterna")
057 @DependsOn({"core"})
058 @SuppressWarnings("rawtypes")
059 public class LanternaBuilderCustomizer extends AbstractBuilderCustomizer {
060     @SuppressWarnings("unchecked")
061     public LanternaBuilderCustomizer() {
062         Map<String, Factory> factories = new LinkedHashMap<>();
063         factories.put("action"new ActionFactory());
064         factories.put("actionListBox"new ActionListBoxFactory());
065         factories.put("actions"new CollectionFactory());
066         factories.put("application"new ApplicationFactory());
067         factories.put("bean"new ComponentFactory(Object.class, true));
068         factories.put("borderLayout"new LayoutFactory(BorderLayout.class));
069         factories.put("button"new ButtonFactory());
070         factories.put("checkBox"new CheckBoxFactory());
071         factories.put("container"new ComponentFactory(Component.class, false));
072         factories.put("emptySpace"new EmptySpaceFactory());
073         factories.put("hbox"new BoxFactory(Panel.Orientation.HORISONTAL));
074         factories.put("horisontalLayout"new LayoutFactory(HorisontalLayout.class));
075         factories.put("horizontalLayout"new LayoutFactory(HorisontalLayout.class));
076         factories.put("label"new LabelFactory());
077         factories.put("list"new CollectionFactory());
078         factories.put("panel"new PanelFactory());
079         factories.put("passwordBox"new PasswordBoxFactory());
080         factories.put("progressBar"new ProgressBarFactory());
081         factories.put("table"new TableFactory());
082         factories.put("textArea"new TextAreaFactory());
083         factories.put("textBox"new TextBoxFactory());
084         factories.put("vbox"new BoxFactory(Panel.Orientation.VERTICAL));
085         factories.put("verticalLayout"new LayoutFactory(VerticalLayout.class));
086         factories.put("widget"new ComponentFactory(Component.class, true));
087         setFactories(factories);
088 
089         Closure c = new Closure(this) {
090             @Override
091             public Object call(Object... args) {
092                 return handleIdAttribute(args);
093             }
094 
095             private Object handleIdAttribute(Object[] args) {
096                 FactoryBuilderSupport builder = (FactoryBuilderSupportargs[0];
097                 Object node = args[1];
098                 Map attributes = (Mapargs[2];
099                 if (attributes.containsKey("id")) {
100                     String id = attributes.remove("id").toString();
101                     builder.setVariable(id, node);
102                 }
103                 return null;
104             }
105         };
106         setAttributeDelegates(newList(c));
107     }
108 }