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