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 = (FactoryBuilderSupport) args[0];
099 Object node = args[1];
100 Map attributes = (Map) args[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 }
|