package org.schmivits.airball.dataproxy.view; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.TextView; import org.schmivits.airball.dataproxy.R; import org.schmivits.airball.dataproxy.data.ProcessNode; import org.schmivits.airball.dataproxy.data.ProcessNode.RunMode; public class ProcessNodeView extends FrameLayout { private final ProcessNode mModel; private final ProcessNode.ChangeListener mChangeListener = new ProcessNode.ChangeListener() { @Override public void statusChanged() { post(new Runnable() { @Override public void run() { ((TextView) findViewById(R.id.process_node_view_status)) .setText(mModel.getStatus()); } }); } @Override public void runModeChanged() { post(new Runnable() { @Override public void run() { ((TextView) findViewById(R.id.process_node_view_runmode)) .setText("" + mModel.getRunMode()); updateRemoveEnabled(); } }); } @Override public void childrenChanged() { final ProcessNode[] nodes = mModel.getChildren(); post(new Runnable() { @Override public void run() { ViewGroup subviews = (ViewGroup) findViewById(R.id.process_node_view_subviews); subviews.removeAllViews(); for (ProcessNode node : nodes) { subviews.addView(ProcessNodeViewFactory.make(node, getContext())); } updateRemoveEnabled(); } }); } void updateRemoveEnabled() { ((ImageButton) findViewById(R.id.process_node_view_remove)).setEnabled( mModel.getParent() != null && mModel.getRunMode() == RunMode.FINISHED && mModel.getChildren().length == 0); } }; public ProcessNodeView(Context context, AttributeSet attrs) { this(null, context, attrs); } public ProcessNodeView(ProcessNode model, Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.process_node_view, this); mModel = model; if (!isInEditMode()) { ((TextView) findViewById(R.id.process_node_view_title)).setText( mModel.getClass().getSimpleName() + " " + mModel.getTitle()); mChangeListener.statusChanged(); mChangeListener.runModeChanged(); mChangeListener.childrenChanged(); model.addChangeListener(mChangeListener); ((ImageButton) findViewById(R.id.process_node_view_remove)).setOnClickListener( new OnClickListener() { @Override public void onClick(View view) { mModel.getParent().cleanupChild(mModel); } }); addAdditional((ViewGroup) findViewById(R.id.process_node_view_additional)); } } protected void addAdditional(ViewGroup parent) { } protected ProcessNode getModel() { return mModel; } @Override protected void onVisibilityChanged(View v, int flag) { if (flag == View.VISIBLE) { mModel.addChangeListener(mChangeListener); } else { mModel.removeChangeListener(mChangeListener); } } }