339 lines
6.5 KiB
C++
339 lines
6.5 KiB
C++
|
/* i_view.cpp
|
||
|
*
|
||
|
* Copyright (c) 1994-1996, Marko Macek
|
||
|
*
|
||
|
* You may distribute under the terms of either the GNU General Public
|
||
|
* License or the Artistic License, as specified in the README file.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#include "fte.h"
|
||
|
|
||
|
GxView::GxView(GFrame *Parent): GView(Parent, -1, -1) {
|
||
|
Top = Bottom = 0;
|
||
|
MouseCaptured = 0;
|
||
|
}
|
||
|
|
||
|
GxView::~GxView() {
|
||
|
if (Top) {
|
||
|
ExView *V;
|
||
|
|
||
|
while (Top) {
|
||
|
V = Top;
|
||
|
Top = Top->Next;
|
||
|
V->Win = 0;
|
||
|
delete V;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void GxView::PushView(ExView *view) {
|
||
|
int W, H;
|
||
|
ConQuerySize(&W, &H);
|
||
|
|
||
|
view->Win = this;
|
||
|
if (Top == 0) {
|
||
|
Top = Bottom = view;
|
||
|
view->Next = 0;
|
||
|
} else {
|
||
|
Top->Activate(0);
|
||
|
view->Next = Top;
|
||
|
Top = view;
|
||
|
Top->Activate(1);
|
||
|
}
|
||
|
Top->Resize(W, H);
|
||
|
}
|
||
|
|
||
|
ExView *GxView::PopView() {
|
||
|
ExView *V;
|
||
|
|
||
|
if (Top == 0)
|
||
|
return 0;
|
||
|
|
||
|
Top->Activate(0);
|
||
|
|
||
|
V = Top;
|
||
|
Top = Top->Next;
|
||
|
|
||
|
if (Top == 0)
|
||
|
Bottom = 0;
|
||
|
else {
|
||
|
Top->Activate(1);
|
||
|
Top->Repaint();
|
||
|
}
|
||
|
V->Win = 0;
|
||
|
|
||
|
return V;
|
||
|
}
|
||
|
|
||
|
void GxView::NewView(ExView * /*view*/) {
|
||
|
}
|
||
|
|
||
|
EEventMap *GxView::GetEventMap() {
|
||
|
if (Top)
|
||
|
return Top->GetEventMap();
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int GxView::ExecCommand(int Command, ExState &State) {
|
||
|
if (Top)
|
||
|
return Top->ExecCommand(Command, State);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int GxView::BeginMacro() {
|
||
|
if (Top)
|
||
|
return Top->BeginMacro();
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
int GxView::GetContext() {
|
||
|
if (Top)
|
||
|
return Top->GetContext();
|
||
|
else
|
||
|
return CONTEXT_NONE;
|
||
|
}
|
||
|
|
||
|
void GxView::HandleEvent(TEvent &Event) {
|
||
|
GView::HandleEvent(Event);
|
||
|
Top->HandleEvent(Event);
|
||
|
|
||
|
if (Event.What & evMouse) {
|
||
|
int W, H;
|
||
|
|
||
|
ConQuerySize(&W, &H);
|
||
|
|
||
|
if (Event.What != evMouseDown || Event.Mouse.Y == H - 1) {
|
||
|
switch (Event.What) {
|
||
|
case evMouseDown:
|
||
|
if (CaptureMouse(1))
|
||
|
MouseCaptured = 1;
|
||
|
else
|
||
|
break;
|
||
|
Event.What = evNone;
|
||
|
break;
|
||
|
case evMouseMove:
|
||
|
if (MouseCaptured) {
|
||
|
if (Event.Mouse.Y != H - 1)
|
||
|
ExpandHeight(Event.Mouse.Y - H + 1);
|
||
|
Event.What = evNone;
|
||
|
}
|
||
|
break;
|
||
|
case evMouseAuto:
|
||
|
if (MouseCaptured)
|
||
|
Event.What = evNone;
|
||
|
break;
|
||
|
case evMouseUp:
|
||
|
if (MouseCaptured)
|
||
|
CaptureMouse(0);
|
||
|
else
|
||
|
break;
|
||
|
MouseCaptured = 0;
|
||
|
Event.What = evNone;
|
||
|
break;
|
||
|
}
|
||
|
return ;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void GxView::Update() {
|
||
|
if (Top) {
|
||
|
Top->Update();
|
||
|
}// else
|
||
|
// Repaint();
|
||
|
}
|
||
|
|
||
|
void GxView::Repaint() {
|
||
|
if (Top) {
|
||
|
Top->Repaint();
|
||
|
} else {
|
||
|
TDrawBuffer B;
|
||
|
int X, Y;
|
||
|
|
||
|
ConQuerySize(&X, &Y);
|
||
|
MoveCh(B, ' ', 0x07, X);
|
||
|
ConPutLine(0, 0, X, Y, B);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void GxView::Resize(int width, int height) {
|
||
|
ExView *V;
|
||
|
GView::Resize(width, height);
|
||
|
V = Top;
|
||
|
|
||
|
while (V) {
|
||
|
V->Resize(width, height);
|
||
|
V = V->Next;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void GxView::Activate(int gotfocus) {
|
||
|
if (Top)
|
||
|
Top->Activate(gotfocus);
|
||
|
GView::Activate(gotfocus);
|
||
|
}
|
||
|
|
||
|
void GxView::UpdateTitle(char *Title, char *STitle) {
|
||
|
if (Parent && Parent->Active == this) {
|
||
|
Parent->ConSetTitle(Title, STitle);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int GxView::GetStr(const char *Prompt, unsigned int BufLen, char *Str, int HistId) {
|
||
|
if ((HaveGUIDialogs & GUIDLG_PROMPT) && GUIDialogs) {
|
||
|
return DLGGetStr(this, Prompt, BufLen, Str, HistId, 0);
|
||
|
} else {
|
||
|
return ReadStr(Prompt, BufLen, Str, 0, 1, HistId);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int GxView::GetFile(const char *Prompt, unsigned int BufLen, char *Str, int HistId, int Flags) {
|
||
|
if ((HaveGUIDialogs & GUIDLG_FILE) && GUIDialogs)
|
||
|
return DLGGetFile(this, Prompt, BufLen, Str, Flags);
|
||
|
else
|
||
|
return ReadStr(Prompt, BufLen, Str, CompletePath, SelectPathname, HistId);
|
||
|
}
|
||
|
|
||
|
int GxView::ReadStr(const char *Prompt, unsigned int BufLen, char *Str, Completer Comp, int Select, int HistId) {
|
||
|
int rc;
|
||
|
ExInput *input;
|
||
|
|
||
|
input = new ExInput(Prompt, Str, BufLen, Comp, Select, HistId);
|
||
|
if (input == 0)
|
||
|
return 0;
|
||
|
|
||
|
PushView((ExView *)input);
|
||
|
|
||
|
rc = Execute();
|
||
|
|
||
|
PopView();
|
||
|
|
||
|
Repaint();
|
||
|
|
||
|
if (rc == 1) {
|
||
|
strncpy(Str, input->Line, BufLen - 1);
|
||
|
Str[BufLen - 1] = 0;
|
||
|
}
|
||
|
delete input;
|
||
|
|
||
|
return rc;
|
||
|
}
|
||
|
|
||
|
int GxView::Choice(unsigned long Flags, const char *Title, int NSel, ... /* choices, format, args */) {
|
||
|
int rc;
|
||
|
va_list ap;
|
||
|
|
||
|
if ((HaveGUIDialogs & GUIDLG_CHOICE) && GUIDialogs) {
|
||
|
va_start(ap, NSel);
|
||
|
rc = DLGPickChoice(this, Title, NSel, ap, Flags);
|
||
|
va_end(ap);
|
||
|
return rc;
|
||
|
} else {
|
||
|
ExChoice *choice;
|
||
|
|
||
|
va_start(ap, NSel);
|
||
|
|
||
|
choice = new ExChoice(Title, NSel, ap);
|
||
|
|
||
|
va_end(ap);
|
||
|
|
||
|
if (choice == 0)
|
||
|
return 0;
|
||
|
|
||
|
PushView(choice);
|
||
|
rc = Execute();
|
||
|
PopView();
|
||
|
Repaint();
|
||
|
|
||
|
delete choice;
|
||
|
|
||
|
return rc;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
TKeyCode GxView::GetChar(const char *Prompt) {
|
||
|
int rc;
|
||
|
ExKey *key;
|
||
|
TKeyCode K = 0;
|
||
|
|
||
|
key = new ExKey(Prompt);
|
||
|
if (key == 0)
|
||
|
return 0;
|
||
|
|
||
|
PushView(key);
|
||
|
rc = Execute();
|
||
|
PopView();
|
||
|
Repaint();
|
||
|
|
||
|
if (rc == 1)
|
||
|
K = key->Key;
|
||
|
delete key;
|
||
|
|
||
|
return K;
|
||
|
}
|
||
|
|
||
|
#ifdef CONFIG_I_SEARCH
|
||
|
int GxView::IncrementalSearch(EView *View) {
|
||
|
int rc;
|
||
|
ExISearch *search;
|
||
|
EBuffer *B = 0;
|
||
|
|
||
|
if (View->GetContext() != CONTEXT_FILE)
|
||
|
return 0;
|
||
|
|
||
|
B = (EBuffer *)View->Model;
|
||
|
|
||
|
search = new ExISearch(B);
|
||
|
|
||
|
if (search == 0)
|
||
|
return 0;
|
||
|
|
||
|
PushView(search);
|
||
|
rc = Execute();
|
||
|
PopView();
|
||
|
Repaint();
|
||
|
|
||
|
delete search;
|
||
|
|
||
|
return rc;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef CONFIG_I_ASCII
|
||
|
int GxView::PickASCII() {
|
||
|
int rc;
|
||
|
ExASCII *ascii;
|
||
|
|
||
|
ascii = new ExASCII();
|
||
|
if (ascii == 0)
|
||
|
return 0;
|
||
|
|
||
|
PushView(ascii);
|
||
|
rc = Execute();
|
||
|
PopView();
|
||
|
Repaint();
|
||
|
|
||
|
delete ascii;
|
||
|
return rc;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef CONFIG_I_COMPLETE
|
||
|
int GxView::ICompleteWord(EView *View) {
|
||
|
int rc = 0;
|
||
|
|
||
|
if (View->GetContext() == CONTEXT_FILE) {
|
||
|
ExComplete *c = new ExComplete((EBuffer *)View->Model);
|
||
|
if (c != NULL) {
|
||
|
PushView(c);
|
||
|
rc = Execute();
|
||
|
PopView();
|
||
|
Repaint();
|
||
|
delete c;
|
||
|
}
|
||
|
}
|
||
|
return rc;
|
||
|
}
|
||
|
#endif
|