2010-07-12 7 views
1

Je voudrais avoir un gestionnaire de mise en page qui peut organiser deux éléments comme suit:Comment créer un layoutmanager draw2d personnalisé?

  • un élément principal ABCDEF centré

  • un élément « Postscript » XYZ, positionné sur le coin supérieur droit de la encapsulation figure

Par exemple:

***********XYZ* 
* ABCDEF * 
*************** 

Puis-je utiliser un gestionnaire de disposition existant pour cela? Comment puis-je créer un gestionnaire de disposition personnalisé qui le supporte?

Un grand merci pour vos conseils.

Répondre

0

Vous pouvez le faire en utilisant XYLayout.

Il y a un exemple que vous pouvez construire sur:

import org.eclipse.draw2d.AbstractLayout; 
import org.eclipse.draw2d.Figure; 
import org.eclipse.draw2d.FigureCanvas; 
import org.eclipse.draw2d.IFigure; 
import org.eclipse.draw2d.Label; 
import org.eclipse.draw2d.LayoutManager; 
import org.eclipse.draw2d.LineBorder; 
import org.eclipse.draw2d.Panel; 
import org.eclipse.draw2d.XYLayout; 
import org.eclipse.draw2d.geometry.Dimension; 
import org.eclipse.draw2d.geometry.Insets; 
import org.eclipse.draw2d.geometry.PrecisionRectangle; 
import org.eclipse.draw2d.geometry.Rectangle; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.layout.FillLayout; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Shell; 


public class HHH { 

    public static void main(String[] args) { 
     Display d = new Display(); 
     Shell s = new Shell(); 
     s.setLayout(new FillLayout()); 

     FigureCanvas canvas = new FigureCanvas(s); 

     Figure content = new Figure(); 
     content.setLayoutManager(new XYLayout()); 

     PostScriptedFigure figure = new PostScriptedFigure(); 
     content.add(figure, new Rectangle(100, 100, -1, -1)); 

     figure.setMainFigure(new Label("The Main figure")); 
     figure.setPostScriptFigure(new Label("ps")); 
     figure.setBorder(new LineBorder()); 

     canvas.setContents(content); 

     s.setSize(600, 500); 
     s.open(); 

     while (!s.isDisposed()) { 
      if (!d.readAndDispatch()) { 
       d.sleep(); 
      } 
     } 
    } 

} 

class PostScriptedFigure extends Panel { 

    private IFigure mainFigure, postScriptFigure; 

    private class PostScriptedLayoutManager extends AbstractLayout { 

    @Override 
    public void layout(IFigure container) { 
     final Rectangle clientArea = container.getClientArea(); 

     final IFigure mainFigure = getMainFigure(); 
     final IFigure postScriptFigure = getPostScriptFigure(); 

     if (mainFigure != null) { 
      final Rectangle bounds = new PrecisionRectangle(); 
      bounds.setSize(mainFigure.getPreferredSize(SWT.DEFAULT, SWT.DEFAULT)); 

      final Rectangle mainClientArea = clientArea.getCopy(); 
      if (postScriptFigure != null) { 
       mainClientArea.shrink(new Insets(postScriptFigure.getPreferredSize().height(), 0, 0, 0)); 
      } 
      bounds.translate(mainClientArea.getCenter().getTranslated(bounds.getSize().getScaled(0.5f).getNegated())); 
      mainFigure.setBounds(bounds); 
     } 
     if (postScriptFigure != null) { 
      final Rectangle bounds = new PrecisionRectangle(); 
      bounds.setSize(postScriptFigure.getPreferredSize(SWT.DEFAULT, SWT.DEFAULT)); 
      bounds.translate(clientArea.getTopRight().getTranslated(bounds.getSize().getNegated().width(), 0)); 
      postScriptFigure.setBounds(bounds); 
     } 
     // note that other potentionally added figures are ignored 
    } 

    @Override 
    protected Dimension calculatePreferredSize(IFigure container, int wHint, int hHint) { 
     final Rectangle rect = new PrecisionRectangle(); 

     final IFigure mainFigure = getMainFigure(); 
     if (mainFigure != null) { 
      rect.setSize(mainFigure.getPreferredSize()); 
     } 
     final IFigure postScriptFigure = getPostScriptFigure(); 
     if (postScriptFigure != null) { 
      rect.resize(mainFigure != null ? 0 : postScriptFigure.getPreferredSize().width() , postScriptFigure.getPreferredSize().height()); 
     } 

     // note that other potentionally added figures are ignored 

     final Dimension d = rect.getSize(); 
     final Insets insets = container.getInsets(); 
     return new Dimension(d.width + insets.getWidth(), d.height + insets.getHeight()).union(getBorderPreferredSize(container)); 
    } 

} 

public PostScriptedFigure() { 
    super.setLayoutManager(new PostScriptedLayoutManager()); 
} 

@Override 
public void setLayoutManager(LayoutManager manager) { 
    // prevent from setting wrong layout manager 
} 

public IFigure getMainFigure() { 
    return mainFigure; 
} 

public void setMainFigure(IFigure mainFigure) { 
    if (getMainFigure() != null) { 
     remove(getMainFigure()); 
    } 
    this.mainFigure = mainFigure; 
    add(mainFigure); 
} 

public IFigure getPostScriptFigure() { 
    return postScriptFigure; 
} 

public void setPostScriptFigure(IFigure postScriptFigure) { 
    if (getPostScriptFigure() != null) { 
     remove(getPostScriptFigure()); 
    } 
    this.postScriptFigure = postScriptFigure; 
    add(postScriptFigure); 
} 

} 
+0

Si vous ajoutez plus d'informations, cela pourrait être une réponse utile. –

Questions connexes