001 /*
002 * Copyright 2008-2015 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 = (FactoryBuilderSupport) args[0];
097 Object node = args[1];
098 Map attributes = (Map) args[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 }
|