/**
  * Make sure the text in slide 0 is no longer holding onto a reference to the text in the message
  * text box.
  */
 public void prepareForSend() {
   if (size() == 1) {
     TextModel text = get(0).getText();
     if (text != null) {
       text.cloneText();
     }
   }
 }
 private void initRenderer() {
   if (renderer3d) {
     nodeRenderer = new Renderer3D();
     edgeRenderer = new Renderer3D();
   } else {
     nodeRenderer = new Renderer2D();
     edgeRenderer = new Renderer2D();
   }
   nodeRenderer.initRenderer(model.getNodeFont());
   edgeRenderer.initRenderer(model.getEdgeFont());
 }
  private PduBody makePduBody(Context context, SMILDocument document, boolean isMakingCopy) {
    PduBody pb = new PduBody();

    boolean hasForwardLock = false;
    for (SlideModel slide : mSlides) {
      for (MediaModel media : slide) {
        if (isMakingCopy) {
          if (media.isDrmProtected() && !media.isAllowedToForward()) {
            hasForwardLock = true;
            continue;
          }
        }

        PduPart part = new PduPart();

        if (media.isText()) {
          TextModel text = (TextModel) media;
          // Don't create empty text part.
          if (TextUtils.isEmpty(text.getText())) {
            continue;
          }
          // Set Charset if it's a text media.
          part.setCharset(text.getCharset());
        }

        // Set Content-Type.
        part.setContentType(media.getContentType().getBytes());

        String src = media.getSrc();
        String location;
        boolean startWithContentId = src.startsWith("cid:");
        if (startWithContentId) {
          location = src.substring("cid:".length());
        } else {
          location = src;
        }

        // Set Content-Location.
        part.setContentLocation(location.getBytes());

        // Set Content-Id.
        if (startWithContentId) {
          // Keep the original Content-Id.
          part.setContentId(location.getBytes());
        } else {
          int index = location.lastIndexOf(".");
          String contentId = (index == -1) ? location : location.substring(0, index);
          part.setContentId(contentId.getBytes());
        }

        if (media.isDrmProtected()) {
          DrmWrapper wrapper = media.getDrmObject();
          part.setDataUri(wrapper.getOriginalUri());
          part.setData(wrapper.getOriginalData());
        } else if (media.isText()) {
          part.setData(((TextModel) media).getText().getBytes());
        } else if (media.isImage() || media.isVideo() || media.isAudio()) {
          part.setDataUri(media.getUri());
        } else {
          Log.w(TAG, "Unsupport media: " + media);
        }

        pb.addPart(part);
      }
    }

    if (hasForwardLock && isMakingCopy && context != null) {
      Toast.makeText(context, context.getString(R.string.cannot_forward_drm_obj), Toast.LENGTH_LONG)
          .show();
      document = SmilHelper.getDocument(pb);
    }

    // Create and insert SMIL part(as the first part) into the PduBody.
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    SmilXmlSerializer.serialize(document, out);
    PduPart smilPart = new PduPart();
    smilPart.setContentId("smil".getBytes());
    smilPart.setContentLocation("smil.xml".getBytes());
    smilPart.setContentType(ContentType.APP_SMIL.getBytes());
    smilPart.setData(out.toByteArray());
    pb.addPart(0, smilPart);

    return pb;
  }
  public void initArchitecture() {
    model = VizController.getInstance().getVizModel().getTextModel();
    vizConfig = VizController.getInstance().getVizConfig();
    drawable = VizController.getInstance().getDrawable();
    initRenderer();

    // Init sizemodes
    for (SizeMode s : sizeModes) {
      s.init();
    }

    // Model listening
    model.addChangeListener(
        new ChangeListener() {

          public void stateChanged(ChangeEvent e) {
            if (!nodeRenderer.getFont().equals(model.getNodeFont())) {
              nodeRenderer.setFont(model.getNodeFont());
            }
            if (!edgeRenderer.getFont().equals(model.getEdgeFont())) {
              edgeRenderer.setFont(model.getEdgeFont());
            }
            nodeRefresh = true;
            edgeRefresh = true;
          }
        });

    // Model change
    VizController.getInstance()
        .getVizModel()
        .addPropertyChangeListener(
            new PropertyChangeListener() {

              public void propertyChange(PropertyChangeEvent evt) {
                if (evt.getPropertyName().equals("init")) {
                  TextManager.this.model = VizController.getInstance().getVizModel().getTextModel();

                  // Initialize columns if needed
                  if (model.getNodeTextColumns() == null
                      || model.getNodeTextColumns().length == 0) {
                    AttributeController attributeController =
                        Lookup.getDefault().lookup(AttributeController.class);
                    if (attributeController != null && attributeController.getModel() != null) {
                      AttributeModel attributeModel = attributeController.getModel();
                      AttributeColumn[] nodeCols =
                          new AttributeColumn[] {
                            attributeModel
                                .getNodeTable()
                                .getColumn(PropertiesColumn.NODE_LABEL.getIndex())
                          };
                      AttributeColumn[] edgeCols =
                          new AttributeColumn[] {
                            attributeModel
                                .getEdgeTable()
                                .getColumn(PropertiesColumn.EDGE_LABEL.getIndex())
                          };
                      model.setTextColumns(nodeCols, edgeCols);
                    }
                  }

                  DynamicModel dynamicModel = dynamicController.getModel();
                  if (dynamicModel != null) {
                    currentTimeInterval = dynamicModel.getVisibleInterval();
                    builder.setDefaultEstimator(dynamicModel.getEstimator());
                    builder.setNumberEstimator(dynamicModel.getNumberEstimator());
                  } else {
                    currentTimeInterval = null;
                  }
                }
              }
            });

    // Settings
    antialised = vizConfig.isLabelAntialiased();
    mipmap = vizConfig.isLabelMipMap();
    fractionalMetrics = vizConfig.isLabelFractionalMetrics();
    renderer3d = false;

    // Dynamic change
    dynamicController = Lookup.getDefault().lookup(DynamicController.class);
    dynamicController.addModelListener(
        new DynamicModelListener() {

          public void dynamicModelChanged(DynamicModelEvent event) {
            if (event.getEventType().equals(DynamicModelEvent.EventType.VISIBLE_INTERVAL)) {
              currentTimeInterval = (TimeInterval) event.getData();
            }
          }
        });
  }