package com.applang.components; import java.awt.Component; import java.awt.Container; import java.io.StringWriter; import java.io.Writer; import javax.swing.JComponent; import javax.swing.SwingUtilities; import org.gjt.sp.jedit.Buffer; import org.gjt.sp.jedit.EditPane; import org.gjt.sp.jedit.textarea.TextArea; import android.util.Log; import static com.applang.Util.*; import static com.applang.Util2.*; import static com.applang.SwingUtil.*; public class DoubleFeature { protected static final String TAG = DoubleFeature.class.getSimpleName(); private JComponent widget = null; public void setWidget(JComponent widget) { this.widget = widget; } public JComponent getWidget() { return widget; } public DoubleFeature(TextArea textArea) { setTextArea(textArea); } @Override public String toString() { Writer writer = write(new StringWriter(), identity(this)); String t = ""; for (int i = 0; i < textAreas.length; i++) { t += textAreas[i] == null ? "-" : "+"; } writer = write_assoc(writer, "textAreas", t, 1); writer = write_assoc(writer, "widget", functionValueOrElse("null", new Function<String>() { public String apply(Object...params) { return widget.getClass().getSimpleName(); } } ), 1); Container container = getFeature().getParent(); if (container instanceof EditPane) { EditPane editPane = (EditPane)container; Buffer buffer = editPane.getBuffer(); if (buffer != null) writer = write_assoc(writer, "buffer", buffer, 1); } return writer.toString(); } protected TextArea[] textAreas = {null,null}; public void setTextArea(TextArea textArea) { textAreas[0] = textArea; } public TextArea getTextArea() { return textAreas[0]; } public TextArea getTextArea2() { return textAreas[1]; } public Component getFeature() { return textAreas[0] != null ? textAreas[0] : widget; } public void addFeatureTo(Container container) { addCenterComponent(getFeature(), container); container.validate(); container.repaint(); } protected boolean isolate(Object...params) { Component target = getFeature(); Container container = target.getParent(); if (container == null) { Log.w(TAG, String.format("%s cannot be isolated", identity(target))); return false; } container.remove(target); if (params.length > 0) params[0] = container; return true; } protected void integrate(Container container, boolean featured) { if (container != null) { if (featured) { if (textAreas[0] != null) { textAreas[1] = textAreas[0]; setTextArea(null); } } else { if (textAreas[1] != null) { setTextArea(textAreas[1]); textAreas[1] = null; } } addFeatureTo(container); container = null; } } public void toggle(boolean featured, Job<Container> inIsolation, Object...args) { Object[] params = {null}; if (isolate(params)) { Container container = (Container) params[0]; if (inIsolation != null) try { inIsolation.perform(container, args); } catch (Exception e) { Log.e(TAG, "toggle", e); } integrate(container, featured); } } public static final String FOCUS = "focus"; public static final String REQUEST = "request"; public static Component[] focusRequestComponents(Container container) { final Component[] focused = findComponents(container, new Predicate<Component>() { public boolean apply(Component c) { String name = stringValueOf(c.getName()); return check(name, Constraint.AMONG, DoubleFeature.FOCUS) || check(name, Constraint.AMONG, DoubleFeature.REQUEST); } }); no_println("focusRequest", identity(asList(focused).toArray())); return focused; } public void requestFocus() { TextArea textArea = getTextArea(); if (textArea != null) textArea.requestFocus(); else if (widget != null) { Component component = findFirstComponent(widget, FOCUS, Constraint.AMONG); if (component != null) { component.requestFocusInWindow(); diag_println(DIAG_OFF, "focus", identity(component), identity(SwingUtilities.getAncestorOfClass(EditPane.class, component))); } } } }