#include #include #include #include #include #include #include #include #include #include #include #include #include #include void FileChooser::Init (const char* t, const char* subt) { if (*t == '\0') { title = new MarginFrame(new VGlue(0, 0)); } else { title = new MarginFrame(new Message(t)); } if (*subt == '\0') { subtitle = new MarginFrame(new VGlue(0, 0)); } else { subtitle = new MarginFrame(new Message(subt)); } } void FileChooser::SelectFile () { const char* path = _sedit->Text(); int left = strlen(browser()->ValidDirectories(path)); int right = strlen(path); Select(left, right); } void FileChooser::UpdateEditor () { int index = browser()->Selection(); if (index >= 0) { _sedit->Message(browser()->Path(index)); browser()->UnselectAll(); } else { _sedit->Message(browser()->Normalize(_sedit->Text())); } SelectFile(); } void FileChooser::UpdateBrowser () { browser()->SetDirectory(Choice()); } boolean FileChooser::Accept () { boolean accepted, dirSelected; do { accepted = StringChooser::Accept(); dirSelected = browser()->IsADirectory(Choice()); } while (accepted && dirSelected); return accepted; } static void ChangeMsg (const char* name, MarginFrame* frame) { Interactor* msg; if (*name == '\0') { msg = new VGlue(0, 0); } else { msg = new Message(name); } frame->Insert(msg); frame->Change(msg); } void FileChooser::SetTitle (const char* name) { ChangeMsg(name, title); } void FileChooser::SetSubtitle (const char* name) { ChangeMsg(name, subtitle); } Interactor* FileChooser::AddScroller (Interactor* i) { return new HBox( new MarginFrame(i, 2), new VBorder, new VBox( new UpMover(i, 1), new HBorder, new VScroller(i), new HBorder, new DownMover(i, 1) ) ); } Interactor* FileChooser::Interior (const char* acptLbl) { const int space = round(.5*cm); VBox* titleblock = new VBox( new HBox(title, new HGlue), new HBox(subtitle, new HGlue) ); return new MarginFrame( new VBox( titleblock, new VGlue(space, 0), new Frame(new MarginFrame(_sedit, 2)), new VGlue(space, 0), new Frame(AddScroller(browser())), new VGlue(space, 0), new HBox( new VGlue(space, 0), new HGlue, new PushButton("Cancel", state, '\007'), new HGlue(space, 0), new PushButton(acptLbl, state, '\r') ) ), space, space/2, 0 ); }