diff --git a/icodeless-api/src/main/java/com/itangcent/icode/api/AbstractTemplateEditor.java b/icodeless-api/src/main/java/com/itangcent/icode/api/AbstractTemplateEditor.java
index 78f6567..a0e46f0 100644
--- a/icodeless-api/src/main/java/com/itangcent/icode/api/AbstractTemplateEditor.java
+++ b/icodeless-api/src/main/java/com/itangcent/icode/api/AbstractTemplateEditor.java
@@ -10,13 +10,6 @@ public AbstractTemplateEditor(EditableTemplate template) {
this.template = template;
}
- @Override
- public void show() {
- renderTemplate(template);
- }
-
- protected abstract void renderTemplate(Template template);
-
protected abstract String name();
protected abstract String displayName();
@@ -40,6 +33,5 @@ public void save() {
saveTemplate(template);
}
- protected abstract void saveTemplate(Template template);
-
+ protected abstract void saveTemplate(EditableTemplate template);
}
diff --git a/icodeless-api/src/main/java/com/itangcent/icode/api/EditableTemplateManager.java b/icodeless-api/src/main/java/com/itangcent/icode/api/EditableTemplateManager.java
new file mode 100644
index 0000000..0a99e52
--- /dev/null
+++ b/icodeless-api/src/main/java/com/itangcent/icode/api/EditableTemplateManager.java
@@ -0,0 +1,35 @@
+package com.itangcent.icode.api;
+
+
+public interface EditableTemplateManager extends TemplateManager {
+
+ /**
+ * Find template by name.
+ * the Template get from EditableTemplateManager should be editable
+ *
+ * @param name -template name
+ * @return the template which is editable
+ */
+ @Override
+ EditableTemplate findByName(String name);
+
+ /**
+ * Find template by name and context.
+ * The Template get from EditableTemplateManager should be editable
+ *
+ * @param name -template name
+ * @return the template which is editable
+ */
+ @Override
+ EditableTemplate findByName(String name, TemplateContext context);
+
+ /**
+ * Return true if any template was modified.
+ */
+ boolean isAnyModified();
+
+ /**
+ * Save all changes.
+ */
+ void save();
+}
diff --git a/icodeless-api/src/main/java/com/itangcent/icode/api/TemplateEditor.java b/icodeless-api/src/main/java/com/itangcent/icode/api/TemplateEditor.java
index 0b2c82c..0618fc3 100644
--- a/icodeless-api/src/main/java/com/itangcent/icode/api/TemplateEditor.java
+++ b/icodeless-api/src/main/java/com/itangcent/icode/api/TemplateEditor.java
@@ -2,9 +2,7 @@
public interface TemplateEditor {
- void show();
-
- void cancel();
+ void reset();
void save();
diff --git a/icodeless-api/src/main/java/com/itangcent/icode/api/TemplateEditorBuilder.java b/icodeless-api/src/main/java/com/itangcent/icode/api/TemplateEditorBuilder.java
index c6c406c..c694fc6 100644
--- a/icodeless-api/src/main/java/com/itangcent/icode/api/TemplateEditorBuilder.java
+++ b/icodeless-api/src/main/java/com/itangcent/icode/api/TemplateEditorBuilder.java
@@ -2,6 +2,6 @@
public interface TemplateEditorBuilder {
- TemplateEditor createEditor(Template template);
+ TemplateEditor createEditor(EditableTemplate template);
}
diff --git a/icodeless-api/src/main/java/com/itangcent/icode/api/TemplateManager.java b/icodeless-api/src/main/java/com/itangcent/icode/api/TemplateManager.java
index 60d70cb..ef70754 100644
--- a/icodeless-api/src/main/java/com/itangcent/icode/api/TemplateManager.java
+++ b/icodeless-api/src/main/java/com/itangcent/icode/api/TemplateManager.java
@@ -2,9 +2,21 @@
public interface TemplateManager {
+ /**
+ * Find template by name.
+ *
+ * @param name -template name
+ * @return the template which is editable
+ */
default Template findByName(String name) {
return findByName(name, null);
}
+ /**
+ * Find template by name and context.
+ *
+ * @param name -template name
+ * @return the template which is editable
+ */
Template findByName(String name, TemplateContext context);
}
diff --git a/icodeless-core/src/main/java/com/itangcent/icode/ui/UIContainer.java b/icodeless-core/src/main/java/com/itangcent/icode/ui/UIContainer.java
new file mode 100644
index 0000000..da2b983
--- /dev/null
+++ b/icodeless-core/src/main/java/com/itangcent/icode/ui/UIContainer.java
@@ -0,0 +1,115 @@
+package com.itangcent.icode.ui;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.ArrayList;
+import java.util.List;
+
+public interface UIContainer {
+
+ /**
+ * Appends the specified component to the end of this container.
+ *
+ * This method changes layout-related information, and therefore,
+ * invalidates the component hierarchy. If the container has already been
+ * displayed, the hierarchy must be validated thereafter in order to
+ * display the added component.
+ *
+ * @param comp the component to be added
+ * @return the component argument
+ * @throws NullPointerException if {@code comp} is {@code null}
+ * @see javax.swing.JComponent#revalidate()
+ */
+ Component add(Component comp);
+
+ /**
+ * Removes the Viewport
s one lightweight child.
+ */
+ void remove(Component child);
+
+ /**
+ * remove all sub components
+ */
+ void clear();
+
+
+ static UIContainer of(Container container) {
+ if (container instanceof JScrollPane) {
+ return new JScrollPaneUIContainer((JScrollPane) container);
+ } else {
+ return new BaseUIContainer(container);
+ }
+ }
+
+ abstract class AbstractUIContainer implements UIContainer {
+
+ private List subs = new ArrayList<>();
+
+ @Override
+ public Component add(Component comp) {
+ subs.add(comp);
+ return doAdd(comp);
+ }
+
+ @Override
+ public void remove(Component child) {
+ subs.remove(child);
+ doRemove(child);
+ }
+
+ abstract Component doAdd(Component comp);
+
+ abstract void doRemove(Component child);
+
+ @Override
+ public void clear() {
+ if (!subs.isEmpty()) {
+ for (Component sub : subs) {
+ doRemove(sub);
+ }
+ }
+ subs.clear();
+ }
+ }
+
+ class BaseUIContainer extends AbstractUIContainer {
+
+ private Container container;
+
+ private BaseUIContainer(Container container) {
+ this.container = container;
+ }
+
+ @Override
+ public Component doAdd(Component comp) {
+ return container.add(comp);
+ }
+
+ @Override
+ public void doRemove(Component child) {
+ container.remove(child);
+ }
+
+ }
+
+ class JScrollPaneUIContainer extends AbstractUIContainer {
+
+
+ private JScrollPane container;
+
+ private JScrollPaneUIContainer(JScrollPane container) {
+ this.container = container;
+ }
+
+ @Override
+ public Component doAdd(Component comp) {
+ return container.getViewport().add(comp);
+ }
+
+ @Override
+ public void doRemove(Component child) {
+ container.getViewport().remove(child);
+ }
+ }
+
+}
diff --git a/icodeless-core/src/main/java/com/itangcent/icode/ui/UITemplateEditor.java b/icodeless-core/src/main/java/com/itangcent/icode/ui/UITemplateEditor.java
new file mode 100644
index 0000000..16439e0
--- /dev/null
+++ b/icodeless-core/src/main/java/com/itangcent/icode/ui/UITemplateEditor.java
@@ -0,0 +1,15 @@
+package com.itangcent.icode.ui;
+
+import com.itangcent.icode.api.AbstractTemplateEditor;
+import com.itangcent.icode.api.EditableTemplate;
+
+import java.awt.*;
+
+public abstract class UITemplateEditor extends AbstractTemplateEditor {
+
+ public UITemplateEditor(EditableTemplate template) {
+ super(template);
+ }
+
+ public abstract Component createUI();
+}
diff --git a/icodeless-core/src/main/java/com/itangcent/icode/ui/UITemplateEditorBuilder.java b/icodeless-core/src/main/java/com/itangcent/icode/ui/UITemplateEditorBuilder.java
new file mode 100644
index 0000000..be98281
--- /dev/null
+++ b/icodeless-core/src/main/java/com/itangcent/icode/ui/UITemplateEditorBuilder.java
@@ -0,0 +1,33 @@
+package com.itangcent.icode.ui;
+
+import com.itangcent.icode.api.EditableTemplate;
+import com.itangcent.icode.api.TemplateEditor;
+import com.itangcent.icode.api.TemplateEditorBuilder;
+
+import java.awt.*;
+
+public abstract class UITemplateEditorBuilder implements TemplateEditorBuilder {
+
+ /**
+ * The parent container for rendering the template editor
+ */
+ private UIContainer parentContainer;
+
+ public UITemplateEditorBuilder(Container parentContainer) {
+ this.parentContainer = UIContainer.of(parentContainer);
+ }
+
+ @Override
+ public TemplateEditor createEditor(EditableTemplate template) {
+ UITemplateEditor uiTemplateEditor = buildEditor(template);
+ addEditorUIToParent(uiTemplateEditor.createUI());
+ return uiTemplateEditor;
+ }
+
+ protected void addEditorUIToParent(Component editorUI) {
+ parentContainer.clear();
+ parentContainer.add(editorUI);
+ }
+
+ protected abstract UITemplateEditor buildEditor(EditableTemplate template);
+}
diff --git a/icodeless-idea/src/main/java/com/itangcent/idea/plugin/actions/ICodeLessConfigurable.java b/icodeless-idea/src/main/java/com/itangcent/idea/plugin/actions/ICodeLessConfigurable.java
index 317992c..add005f 100644
--- a/icodeless-idea/src/main/java/com/itangcent/idea/plugin/actions/ICodeLessConfigurable.java
+++ b/icodeless-idea/src/main/java/com/itangcent/idea/plugin/actions/ICodeLessConfigurable.java
@@ -2,7 +2,7 @@
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.options.SearchableConfigurable;
-import com.itangcent.idea.plugin.template.manager.EditableTemplateManager;
+import com.itangcent.icode.api.EditableTemplateManager;
import com.itangcent.idea.plugin.ui.ICodeLessConfigurableGUI;
import javax.swing.*;
@@ -14,7 +14,7 @@ public class ICodeLessConfigurable implements SearchableConfigurable {
private EditableTemplateManager templateManager = ServiceManager.getService(EditableTemplateManager.class);
public boolean isModified() {
- return templateManager.isModified();
+ return templateManager.isAnyModified();
}
public String getId() {
diff --git a/icodeless-idea/src/main/java/com/itangcent/idea/plugin/fake/FakeTemplateManager.java b/icodeless-idea/src/main/java/com/itangcent/idea/plugin/fake/FakeTemplateManager.java
index 9850d95..bc72011 100644
--- a/icodeless-idea/src/main/java/com/itangcent/idea/plugin/fake/FakeTemplateManager.java
+++ b/icodeless-idea/src/main/java/com/itangcent/idea/plugin/fake/FakeTemplateManager.java
@@ -1,12 +1,12 @@
package com.itangcent.idea.plugin.fake;
-import com.itangcent.icode.api.Template;
+import com.itangcent.icode.api.EditableTemplate;
+import com.itangcent.icode.api.EditableTemplateManager;
import com.itangcent.icode.api.TemplateContext;
-import com.itangcent.idea.plugin.template.manager.EditableTemplateManager;
public class FakeTemplateManager implements EditableTemplateManager {
@Override
- public boolean isModified() {
+ public boolean isAnyModified() {
return false;
}
@@ -16,12 +16,12 @@ public void save() {
}
@Override
- public Template findByName(String name) {
+ public EditableTemplate findByName(String name) {
return null;
}
@Override
- public Template findByName(String name, TemplateContext context) {
+ public EditableTemplate findByName(String name, TemplateContext context) {
return null;
}
}
diff --git a/icodeless-idea/src/main/java/com/itangcent/idea/plugin/template/manager/EditableTemplateManager.java b/icodeless-idea/src/main/java/com/itangcent/idea/plugin/template/manager/EditableTemplateManager.java
deleted file mode 100644
index 7ca2996..0000000
--- a/icodeless-idea/src/main/java/com/itangcent/idea/plugin/template/manager/EditableTemplateManager.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.itangcent.idea.plugin.template.manager;
-
-
-import com.itangcent.icode.api.TemplateManager;
-
-public interface EditableTemplateManager extends TemplateManager {
-
- boolean isModified();
-
- void save();
-}
diff --git a/icodeless-idea/src/main/resources/META-INF/plugin.xml b/icodeless-idea/src/main/resources/META-INF/plugin.xml
index 1387de8..af36b55 100755
--- a/icodeless-idea/src/main/resources/META-INF/plugin.xml
+++ b/icodeless-idea/src/main/resources/META-INF/plugin.xml
@@ -33,7 +33,7 @@
instance="com.itangcent.idea.plugin.actions.ICodeLessConfigurable"/>