62
|
1 module jface.FileTreeViewer;
|
|
2
|
|
3 import dwt.DWT;
|
|
4 import dwt.widgets.Label;
|
|
5 import dwt.widgets.Control;
|
|
6 import dwt.widgets.Composite;
|
|
7 import dwt.widgets.Display;
|
|
8 import dwt.widgets.Shell;
|
|
9 import dwt.widgets.Button;
|
|
10
|
|
11 import dwt.events.SelectionAdapter;
|
|
12 import dwt.events.SelectionEvent;
|
|
13
|
|
14 import dwt.graphics.Image;
|
|
15 import dwt.graphics.ImageData;
|
|
16
|
|
17 import dwt.layout.GridLayout;
|
|
18 import dwt.layout.GridData;
|
|
19
|
|
20 import dwtx.jface.window.ApplicationWindow;
|
|
21
|
|
22 import dwtx.jface.viewers.Viewer;
|
|
23 import dwtx.jface.viewers.TreeViewer;
|
|
24 import dwtx.jface.viewers.ITreeContentProvider;
|
|
25 import dwtx.jface.viewers.ILabelProvider;
|
|
26 import dwtx.jface.viewers.ILabelProviderListener;
|
|
27 import dwtx.jface.viewers.LabelProviderChangedEvent;
|
|
28
|
|
29 import jive.stacktrace;
|
|
30
|
|
31 import dwt.dwthelper.utils;
|
|
32 import dwt.dwthelper.ByteArrayInputStream;
|
|
33
|
|
34 //------------------------------------
|
|
35 //import dwt.dwthelper.utils;
|
|
36 //------------------------------------
|
|
37
|
|
38 import tango.io.FileRoots;
|
|
39 import tango.io.FilePath;
|
|
40
|
|
41 import tango.util.collection.model.Seq;
|
|
42 import tango.util.collection.ArraySeq;
|
|
43
|
|
44
|
|
45 void main(){
|
|
46 auto hw = new FileTree;
|
|
47 hw.run();
|
|
48 }
|
|
49
|
|
50 class FileTree : ApplicationWindow {
|
|
51
|
|
52 TreeViewer tv;
|
|
53
|
|
54 this(){
|
|
55 super(null);
|
|
56 }
|
|
57
|
|
58 public void run(){
|
|
59 setBlockOnOpen(true);
|
|
60 open();
|
|
61 Display.getCurrent().dispose();
|
|
62 }
|
|
63
|
|
64 protected void configureShell( Shell shell ){
|
|
65 super.configureShell(shell);
|
|
66 shell.setText( "File Tree" );
|
|
67 shell.setSize( 400, 400 );
|
|
68 }
|
|
69
|
|
70 protected Control createContents(Composite parent){
|
|
71 /+ Label label = new Label( parent, DWT.CENTER );
|
|
72 label.setText( "Hello, World" );
|
|
73 return label;+/
|
|
74
|
|
75 auto composite = new Composite( parent, DWT.NONE );
|
|
76 composite.setLayout( new GridLayout(1,false));
|
|
77
|
|
78 // Add a checkbox to toggle whether the labels preserve case
|
|
79 auto preserveCase = new Button( composite, DWT.CHECK );
|
|
80 preserveCase.setText( "&Preserve case" );
|
|
81
|
|
82 // Create the tree viewer to display the file tree
|
|
83 tv = new TreeViewer( composite );
|
|
84 tv.getTree().setLayoutData( new GridData( GridData.FILL_BOTH ));
|
|
85 tv.setContentProvider( new FileTreeContentProvider());
|
|
86 tv.setLabelProvider( new FileTreeLabelProvider() );
|
|
87 tv.setInput( stringcast("root") );
|
|
88
|
|
89 // When user checks the checkbox, toggle the preserve case attribute
|
|
90 // of the label provider
|
|
91 preserveCase.addSelectionListener( new class SelectionAdapter{
|
|
92 public void widgetSelected( SelectionEvent event ){
|
|
93 auto preserveCase = (cast(Button)event.widget).getSelection();
|
|
94 auto ftlp = cast(FileTreeLabelProvider) tv.getLabelProvider();
|
|
95 ftlp.setPreserveCase(preserveCase);
|
|
96 }
|
|
97 });
|
|
98 return composite;
|
|
99 }
|
|
100 }
|
|
101
|
|
102 class FileTreeContentProvider : ITreeContentProvider {
|
|
103 public override Object[] getChildren( Object arg0 ){
|
|
104 Trace.formatln( "trc line={} ", __LINE__ );
|
|
105 try{
|
|
106 auto fp = cast(FilePath)arg0;
|
|
107 Object[] res;
|
|
108 if( !fp.isFolder()) {
|
|
109 return null;
|
|
110 }
|
|
111 foreach( item; fp ){
|
|
112 res ~= FilePath.from( item );
|
|
113 }
|
|
114
|
|
115 Trace.formatln( "trc line={} ", __LINE__ );
|
|
116 return res;
|
|
117 }
|
|
118 catch( Exception e ){
|
|
119 ExceptionPrintStackTrace(e);
|
|
120 return null;
|
|
121 }
|
|
122 }
|
|
123
|
|
124 public override Object getParent(Object arg0 ){
|
|
125 Trace.formatln( "trc line={} ", __LINE__ );
|
|
126 auto fp = cast(FilePath)arg0;
|
|
127 return fp.pop;
|
|
128 }
|
|
129
|
|
130 public override bool hasChildren(Object arg0 ){
|
|
131 Trace.formatln( "trc line={} ", __LINE__ );
|
|
132 auto obj = getChildren(arg0);
|
|
133 return obj is null ? false : obj.length > 0;
|
|
134 }
|
|
135
|
|
136 public override Object[] getElements( Object arg0 ){
|
|
137 Trace.formatln( "trc line={} ", __LINE__ );
|
|
138 Object[] res;
|
|
139 res ~= new FilePath( "/" );
|
|
140 // foreach( root; FileRoots.list()){
|
|
141 // res ~= new FilePath( root );
|
|
142 // }
|
|
143 return res;
|
|
144 }
|
|
145
|
|
146 public override void dispose(){
|
|
147 }
|
|
148
|
|
149 public override void inputChanged(Viewer arg0, Object arg1, Object arg2 ){
|
|
150 }
|
|
151
|
|
152 }
|
|
153
|
|
154 class FileTreeLabelProvider : ILabelProvider {
|
|
155
|
|
156 private Seq!(ILabelProviderListener) listeners;
|
|
157
|
|
158 private Image file;
|
|
159 private Image dir;
|
|
160
|
|
161 private bool preserveCase;
|
|
162
|
|
163 public this(){
|
|
164 Trace.formatln( "trc line={} Label", __LINE__ );
|
|
165 listeners = new ArraySeq!(ILabelProviderListener);
|
|
166
|
|
167 file = new Image( null, new ImageData( new ByteArrayInputStream( cast(byte[])import( "file.png" ))));
|
|
168 dir = new Image( null, new ImageData( new ByteArrayInputStream( cast(byte[])import( "folder.png" ))));
|
|
169 }
|
|
170
|
|
171 public void setPreserveCase(bool preserveCase){
|
|
172 Trace.formatln( "trc line={} Label", __LINE__ );
|
|
173 this.preserveCase = preserveCase;
|
|
174 auto event = new LabelProviderChangedEvent(this);
|
|
175 for( int i = 0, n = listeners.size(); i < n; i++ ){
|
|
176 auto ilpl = listeners.get(i);
|
|
177 ilpl.labelProviderChanged(event);
|
|
178 }
|
|
179 }
|
|
180
|
|
181 public override Image getImage(Object arg0){
|
|
182 Trace.formatln( "trc line={} Label", __LINE__ );
|
|
183 return (cast(FilePath)arg0).isFolder() ? dir : file;
|
|
184 }
|
|
185
|
|
186 public override char[] getText(Object arg0){
|
|
187 auto text = (cast(FilePath)arg0).name();
|
|
188 // if( text.length is 0 ){
|
|
189 // text = (cast(FilePath)arg0).pop.name();
|
|
190 // }
|
|
191 Trace.formatln( "name={} ", text );
|
|
192 Trace.formatln( "trc line={} Label", __LINE__ );
|
|
193 return "x" ~ (preserveCase ? text : text.toUpperCase());
|
|
194 }
|
|
195
|
|
196 public void addListener( ILabelProviderListener arg0 ){
|
|
197 listeners.append(arg0);
|
|
198 }
|
|
199
|
|
200 public void dispose(){
|
|
201 if( dir !is null ) dir.dispose();
|
|
202 if( file !is null ) file.dispose();
|
|
203 }
|
|
204
|
|
205 public bool isLabelProperty(Object arg0, char[] arg1){
|
|
206 return false;
|
|
207 }
|
|
208
|
|
209 public void removeListener(ILabelProviderListener arg0){
|
|
210 listeners.remove(arg0);
|
|
211 }
|
|
212 }
|
|
213
|
|
214
|
|
215
|
|
216
|
|
217
|
|
218
|
|
219
|
|
220
|
|
221
|
|
222
|
|
223
|
|
224
|
|
225
|
|
226
|