重构代码--Extract Method

重构太经典了!
重构里面比较简单的又算是Extract Method,这是我的代码里的一个类,经过我Extract Method后,我自己是越看越喜欢:P
本来createControl方法看起来很晕得,重构够变得非常简单了,几乎不需要注释,每个方法名就是注释.
当然有时候Extract Method是很麻烦的,比如碰到很多其它外部变量时.
对于这个简单的例子,我的心得就是取个好的方法名!

/**
 * 
@author Rey
 
*/

public   class  AutoSqlDataSetPage  extends  WizardPage  {

    
public static final String ID = "AutoSqlDataSetPage";

    
private static final int OK = 0;

    
private static final int CANCEL = -1;

    
private List tableList = null;

    
private DataTable initDataTable = null, resultDataTable = null;

    
private TableViewer initTableViewer = null, resultTableViewer = null;

    
private String[] names = new String[] "" };

    
public AutoSqlDataSetPage() {
        
super(ID);
    }


    
private int index = 1;// input

    
private int click = -1;

    
private Image image = null;

    
private int WIDTH = 40, HEIGHT = 40;

    
private Canvas canvas = null;

    
private ColumnMoveCommand columnMoveCommand = null;

    
public void createControl(final Composite parent) {

        setTitle(
"AutoSqlDataSet Wizard");
        setMessage(
"XXXXXXXXXXXXXXXX", IMessageProvider.INFORMATION);

        Composite composite 
= new Composite(parent, SWT.NULL);
        GridLayout glayout 
= new GridLayout(9true);
        composite.setLayout(glayout);

        Composite mainBtnsComposite 
= createMainBtnsComposite(composite);

        Button mainBtnAdd 
= createMainBtn(mainBtnsComposite, "Add");
        Button mainBtnRemove 
= createMainBtn(mainBtnsComposite, "Remove");
        Button mainBtnProperties 
= createMainBtn(mainBtnsComposite, "Properties");
        Button mainBtnPreview 
= createMainBtn(mainBtnsComposite, "Preview");

        createSeparator(composite);

        createImage(composite);
        createCanvas(composite);

        addListener2Canvas(parent);

        Table initTable 
= createTable(composite);
        initTableViewer 
= new TableViewer(initTable);
        initTableViewer.setContentProvider(
new ColumnContentProvider());
        initTableViewer.setLabelProvider(
new ColumnLabelProvider());

        Composite tableBtnsComposite 
= createTableBtnsComposite(composite);

        
final Button add = createTableBtn(tableBtnsComposite, ">>");
        
final Button remove = createTableBtn(tableBtnsComposite, "<<");
        
final Button addAll = createTableBtn(tableBtnsComposite, ">>>");
        
final Button removeAll = createTableBtn(tableBtnsComposite, "<<<");
        
final Button undo = createUndoAndRedoBtn(tableBtnsComposite, "undo");
        
final Button redo = createUndoAndRedoBtn(tableBtnsComposite, "redo");

        Table resultTable 
= createTable(composite);
        resultTableViewer 
= new TableViewer(resultTable);
        resultTableViewer.setContentProvider(
new ColumnContentProvider());
        resultTableViewer.setLabelProvider(
new ColumnLabelProvider());

        
/***********************************************************************
         * Main Btns' SelectionListener
         *********************************************************************
*/


        addListener2MainBtnAdd(parent, mainBtnAdd);

        
/***********************************************************************
         * Table and Column Btns' SelectionListener
         *********************************************************************
*/


        addListener2AddBtn(add, undo, redo);

        addListener2RemoveBtn(remove, undo, redo);

        addListener2UndoBtn(undo);

        addListener2RedoBtn(redo);

        addListener2AddAllBtn(addAll, undo, redo);

        addListener2RemoveAllBtn(removeAll, undo, redo);

        setControl(composite);
        setPageComplete(
true);
    }


    
private Composite createMainBtnsComposite(Composite composite) {
        GridLayout glayout;
        Composite mainBtnsComposite 
= new Composite(composite, SWT.NULL);
        GridData gd 
= new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalSpan 
= 9;
        mainBtnsComposite.setLayoutData(gd);
        glayout 
= new GridLayout(9true);
        mainBtnsComposite.setLayout(glayout);
        
return mainBtnsComposite;
    }


    
private Button createMainBtn(Composite mainBtnsComposite, String text) {
        GridData gd;
        Button mainBtnAdd 
= new Button(mainBtnsComposite, SWT.PUSH);
        mainBtnAdd.setText(text);
        gd 
= new GridData(GridData.FILL_HORIZONTAL);
        mainBtnAdd.setLayoutData(gd);
        
return mainBtnAdd;
    }


    
private void createSeparator(Composite composite) {
        GridData gd;
        Label label 
= new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
        gd 
= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
        gd.horizontalSpan 
= 9;
        label.setLayoutData(gd);
    }


    
private void createCanvas(Composite composite) {
        GridData gd;
        canvas 
= new Canvas(composite, SWT.NO_REDRAW_RESIZE | SWT.V_SCROLL
                
| SWT.H_SCROLL);
        gd 
= new GridData(GridData.FILL_BOTH);
        gd.horizontalSpan 
= 9;
        canvas.setLayoutData(gd);
    }


    
private void addListener2Canvas(final Composite parent) {
        
final Point origin = new Point(00);

        
final ScrollBar hBar = canvas.getHorizontalBar();
        hBar.addListener(SWT.Selection, 
new Listener() {
            
public void handleEvent(Event e) {
                
int hSelection = hBar.getSelection();
                
int destX = -hSelection - origin.x;
                Rectangle rect 
= image.getBounds();
                canvas.scroll(destX, 
000, rect.width, rect.height, false);
                origin.x 
= -hSelection;
            }

        }
);
        
final ScrollBar vBar = canvas.getVerticalBar();
        vBar.addListener(SWT.Selection, 
new Listener() {
            
public void handleEvent(Event e) {
                
int vSelection = vBar.getSelection();
                
int destY = -vSelection - origin.y;
                Rectangle rect 
= image.getBounds();
                canvas.scroll(
0, destY, 00, rect.width, rect.height, false);
                origin.y 
= -vSelection;
            }

        }
);
        canvas.addListener(SWT.Resize, 
new Listener() {
            
public void handleEvent(Event e) {
                Rectangle rect 
= image.getBounds();
                Rectangle client 
= canvas.getClientArea();
                hBar.setMaximum(rect.width);
                vBar.setMaximum(rect.height);
                hBar.setThumb(Math.min(rect.width, client.width));
                vBar.setThumb(Math.min(rect.height, client.height));
                
int hPage = rect.width - client.width;
                
int vPage = rect.height - client.height;
                
int hSelection = hBar.getSelection();
                
int vSelection = vBar.getSelection();
                
if (hSelection >= hPage) {
                    
if (hPage <= 0)
                        hSelection 
= 0;
                    origin.x 
= -hSelection;
                }

                
if (vSelection >= vPage) {
                    
if (vPage <= 0)
                        vSelection 
= 0;
                    origin.y 
= -vSelection;
                }

                canvas.redraw();
            }

        }
);
        canvas.addListener(SWT.Paint, 
new Listener() {
            
public void handleEvent(Event e) {
                GC gc 
= e.gc;
                gc.drawImage(image, origin.x, origin.y);
                Rectangle rect 
= image.getBounds();
                Rectangle client 
= canvas.getClientArea();
                
int marginWidth = client.width - rect.width;
                
if (marginWidth > 0{
                    gc.fillRectangle(rect.width, 
0, marginWidth, client.height);
                }

                
int marginHeight = client.height - rect.height;
                
if (marginHeight > 0{
                    gc
                            .fillRectangle(
0, rect.height, client.width,
                                    marginHeight);
                }

            }

        }
);

        canvas.addMouseListener(
new MouseListener() {

            
public void mouseDown(MouseEvent e) {
                
int x = e.x, y = e.y;
                
int min = HEIGHT, max = HEIGHT + HEIGHT;
                
if (WIDTH < x && x < WIDTH + WIDTH) {
                    
for (int i = 0; i < index; i++{
                        
if (min < y && y < max) {

                            click 
= i;

                            createImage(parent);
                            canvas.redraw();
                            
break;
                        }

                        min 
= max + HEIGHT;
                        max 
= min + HEIGHT;
                    }

                }

            }


            
public void mouseDoubleClick(MouseEvent e) {
            }


            
public void mouseUp(MouseEvent e) {
            }

        }
);
    }


    
private void createImage(final Composite parent) {
        
int CANVAS_WIDTH = 3 * WIDTH, CANVAS_HEIGHT = (2 * index + 1* HEIGHT;
        image 
= new Image(parent.getDisplay(), CANVAS_WIDTH, CANVAS_HEIGHT);
        GC gc 
= new GC(image);

        drawTable(parent, gc, names);

        drawLine(gc);

        gc.dispose();
    }


    
private void drawLine(GC gc) {
        
for (int i = 0, x = (int) (WIDTH + 0.5 * WIDTH), y = 2 * HEIGHT; i < index - 1; i++{
            gc.drawLine(x, y, x, y 
+ HEIGHT);
            y 
= y + HEIGHT;
            y 
+= HEIGHT;
        }

    }


    
private void drawTable(final Composite parent, GC gc, String[] name) {
        
for (int i = 0, x = WIDTH, y = HEIGHT; i < index; i++{
            
if (i > 0)
                y 
+= 2 * HEIGHT;

            
if (i == click) {
                gc.drawRectangle(x, y, WIDTH, HEIGHT);
                gc.setBackground(parent.getShell().getDisplay().getSystemColor(
                        SWT.COLOR_CYAN));
                gc.fillRectangle(x 
+ 1, y + 1, WIDTH - 1, HEIGHT - 1);
                gc.drawText(name[i], x 
+ 5, y + 5);
            }
 else {
                gc.setBackground(parent.getShell().getDisplay().getSystemColor(
                        SWT.COLOR_WHITE));
                gc.drawRectangle(x, y, WIDTH, HEIGHT);
                gc.drawText(name[i], x 
+ 5, y + 5);
            }

        }

    }


    
private Table createTable(Composite composite) {
        Table table 
= new Table(composite, SWT.MULTI | SWT.FULL_SELECTION
                
| SWT.BORDER);
        GridData gd;
        TableColumn tc 
= new TableColumn(table, SWT.LEFT);
        tc.setWidth(
100);
        tc.setText(
"name");
        tc 
= new TableColumn(table, SWT.LEFT);
        tc.setWidth(
100);
        tc.setText(
"type");
        table.setHeaderVisible(
true);
        table.setLinesVisible(
true);

        gd 
= new GridData();
        gd.horizontalAlignment 
= GridData.FILL;
        gd.verticalAlignment 
= GridData.FILL;
        gd.grabExcessHorizontalSpace 
= true;
        gd.horizontalSpan 
= 4;
        table.setLayoutData(gd);
        
return table;
    }


    
private Composite createTableBtnsComposite(Composite composite) {
        GridLayout glayout;
        GridData gd;
        Composite tableBtnsComposite 
= new Composite(composite, SWT.NULL);
        gd 
= new GridData(GridData.FILL_VERTICAL);
        gd.horizontalAlignment 
= GridData.FILL;
        gd.horizontalSpan 
= 1;
        tableBtnsComposite.setLayoutData(gd);
        glayout 
= new GridLayout(1true);
        tableBtnsComposite.setLayout(glayout);
        
return tableBtnsComposite;
    }


    
private Button createTableBtn(Composite tableBtnsComposite, String text) {
        GridData gd;
        Button btn 
= new Button(tableBtnsComposite, SWT.PUSH);
        btn.setText(text);
        gd 
= new GridData(GridData.FILL_HORIZONTAL);
        btn.setLayoutData(gd);
        
return btn;
    }


    
private Button createUndoAndRedoBtn(Composite tableBtnsComposite,
            String text) 
{
        GridData gd;
        
final Button btn = new Button(tableBtnsComposite, SWT.PUSH);
        btn.setText(text);
        btn.setEnabled(
false);
        gd 
= new GridData(GridData.FILL_HORIZONTAL);
        btn.setLayoutData(gd);
        
return btn;
    }


    
private void addListener2MainBtnAdd(final Composite parent,
            Button mainBtnAdd) 
{
        mainBtnAdd.addSelectionListener(
new SelectionAdapter() {
            @Override
            
public void widgetSelected(SelectionEvent e) {
                
// TODO
                SelectJoinTableDialog sjtd = new SelectJoinTableDialog(parent
                        .getShell());
                sjtd.setInput(tableList);
                sjtd.open();
                
int returnCode = sjtd.getReturnCode();
                
if (returnCode == OK) {
                    Object[] result 
= sjtd.getResult();
                    DataTable dt 
= (DataTable) result[0];
                    index
++;

                    createImage(parent);
                    canvas.redraw();
                }

            }

        }
);
    }


    
private void addListener2AddBtn(Button add, final Button undo,
            
final Button redo) {
        add.addSelectionListener(
new SelectionAdapter() {
            @Override
            
public void widgetSelected(SelectionEvent e) {
                StructuredSelection selection 
= (StructuredSelection) initTableViewer
                        .getSelection();
                columnMoveCommand 
= new ColumnMoveCommand(initDataTable,
                        resultDataTable, selection);
                columnMoveCommand.execute();
                undo.setEnabled(
true);
                redo.setEnabled(
true);

            }

        }
);
    }


    
private void addListener2RemoveBtn(Button remove, final Button undo,
            
final Button redo) {
        remove.addSelectionListener(
new SelectionAdapter() {
            @Override
            
public void widgetSelected(SelectionEvent e) {
                StructuredSelection selection 
= (StructuredSelection) resultTableViewer
                        .getSelection();
                columnMoveCommand 
= new ColumnMoveCommand(resultDataTable,
                        initDataTable, selection);
                columnMoveCommand.execute();
                undo.setEnabled(
true);
                redo.setEnabled(
true);
            }

        }
);
    }


    
private void addListener2UndoBtn(final Button undo) {
        undo.addSelectionListener(
new SelectionAdapter() {
            @Override
            
public void widgetSelected(SelectionEvent e) {
                columnMoveCommand.undo();
            }

        }
);
    }


    
private void addListener2RedoBtn(final Button redo) {
        redo.addSelectionListener(
new SelectionAdapter() {
            @Override
            
public void widgetSelected(SelectionEvent e) {
                columnMoveCommand.redo();
            }

        }
);
    }


    
private void addListener2AddAllBtn(Button addAll, final Button undo,
            
final Button redo) {
        addAll.addSelectionListener(
new SelectionAdapter() {
            @Override
            
public void widgetSelected(SelectionEvent e) {
                columnMoveCommand 
= new ColumnMoveCommand(initDataTable,
                        resultDataTable);
                columnMoveCommand.execute();
                undo.setEnabled(
true);
                redo.setEnabled(
true);

            }

        }
);
    }


    
private void addListener2RemoveAllBtn(Button removeAll, final Button undo,
            
final Button redo) {
        removeAll.addSelectionListener(
new SelectionAdapter() {
            @Override
            
public void widgetSelected(SelectionEvent e) {
                columnMoveCommand 
= new ColumnMoveCommand(resultDataTable,
                        initDataTable);
                columnMoveCommand.execute();
                undo.setEnabled(
true);
                redo.setEnabled(
true);

            }

        }
);
    }


    
public void onEnterPage() {
        AutoDataSetWizardController controller 
= ((AutoDataSetWizard) getWizard())
                .getController();
        tableList 
= controller.getTableList();
        initDataTable 
= controller.getSelectedTable();
        initTableViewer.setInput(initDataTable);

        resultDataTable 
= DoradoFactory.eINSTANCE.createDataTable();
        resultTableViewer.setInput(resultDataTable);

        setNames();

        redrawImage();
    }


    
private void setNames() {
        names 
= new String[tableList.size()];
        
int i = 0;
        
for (Iterator it = tableList.iterator(); it.hasNext(); i++{
            DataTable table 
= (DataTable) it.next();
            names[i] 
= table.getName();
        }

    }


    
private void redrawImage() {
        Composite parent 
= canvas.getParent();
        createImage(parent);
        canvas.redraw();
    }


    
private class ColumnContentProvider implements IStructuredContentProvider {
        
public Object[] getElements(Object inputElement) {
            DataTable table 
= (DataTable) inputElement;
            
return table.getColumns().toArray();
        }


        
public void dispose() {
        }


        
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }

    }


    
private class ColumnLabelProvider implements ITableLabelProvider {
        
public Image getColumnImage(Object element, int columnIndex) {
            
return null;
        }


        
public String getColumnText(Object element, int columnIndex) {
            Column column 
= (Column) element;
            String text 
= "";

            
switch (columnIndex) {
            
case 0:
                text 
= column.getName();
                
break;
            
case 1:
                text 
= column.getType();
                
break;
            }

            
return text;
        }


        
public void addListener(ILabelProviderListener listener) {
        }


        
public void dispose() {
        }


        
public boolean isLabelProperty(Object element, String property) {
            
return false;
        }


        
public void removeListener(ILabelProviderListener listener) {
        }

    }


    
private class ColumnMoveCommand {
        DataTable src, dest;

        List columns;

        StructuredSelection selection;

        
public ColumnMoveCommand(DataTable src, DataTable dest) {
            
this.src = src;
            
this.dest = dest;
            columns 
= new ArrayList();
            
for (Iterator it = src.getColumns().iterator(); it.hasNext();) {
                Column column 
= (Column) it.next();
                columns.add(column);
            }


        }


        
public ColumnMoveCommand(DataTable src, DataTable dest,
                StructuredSelection selection) 
{
            
this.src = src;
            
this.dest = dest;
            
this.selection = selection;
            columns 
= new ArrayList();
            
for (Iterator it = selection.iterator(); it.hasNext();) {
                Column column 
= (Column) it.next();
                columns.add(column);
            }

        }


        
public void execute() {
            
for (Iterator it = columns.iterator(); it.hasNext();) {
                Column c 
= (Column) it.next();
                src.getColumns().remove(c);
                dest.getColumns().add(c);
            }

            refreshTable();
        }


        
public void undo() {
            
for (Iterator it = columns.iterator(); it.hasNext();) {
                Column c 
= (Column) it.next();
                src.getColumns().add(c);
                dest.getColumns().remove(c);
            }

            refreshTable();
        }


        
public void redo() {
            execute();
        }


        
private void refreshTable() {
            initTableViewer.refresh();
            resultTableViewer.refresh();
        }

    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值