|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T c
Length: 5090 (0x13e2)
Types: TextFile
Names: »classeditor.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5
└─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00«
└─⟦de8ce1454⟧
└─⟦this⟧ »contrib/lib/iv/src/bin/iclass/classeditor.c«
/*
* Copyright (c) 1989 Stanford University
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided
* that the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Stanford not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. Stanford makes no representations about
* the suitability of this software for any purpose. It is provided "as is"
* without express or implied warranty.
*
* STANFORD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
* IN NO EVENT SHALL STANFORD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/*
* ClassEditor implementation
*/
#include "classeditor.h"
#include <InterViews/button.h>
#include <InterViews/sensor.h>
#include <InterViews/shape.h>
#include <InterViews/textbuffer.h>
#include <InterViews/textdisplay.h>
#include <stdlib.h>
/*****************************************************************************/
static const char FirstLine = 'g';
static const char LastLine = 'G';
static const char NextLine = 'n';
static const char PrevLine= 'p';
static const char ScrollDown = 'j';
static const char ScrollUp = 'k';
static const char PageDown = ' ';
static const char PageUp = 'b';
static const char HalfPageDown = 'd';
static const char HalfPageUp = 'u';
/*****************************************************************************/
ClassEditor::ClassEditor (
ButtonState* bs, int r, int c, int t, int h, const char* done
) : TextEditor(r, c, t, h) {
Init(bs, done);
}
ClassEditor::ClassEditor (
ButtonState* bs, const char* name, int r, int c, int t, int h,
const char* done
) : TextEditor(name, r, c, t, h) {
Init(bs, done);
}
void ClassEditor::Init (ButtonState* bs, const char* done) {
SetClassName("ClassEditor");
input = new Sensor;
input->Catch(DownEvent);
input->Catch(KeyEvent);
_state = bs;
_done = done;
}
void ClassEditor::ScrollBy (int lines) {
TextEditor::ScrollBy(0, -lines*shape->vunits);
// explicit TextEditor:: works around cfront 1.2 bug
int line = text->LineNumber(Dot());
Coord b = display->Base(line);
Coord t = display->Top(line);
if (b < 0) {
Select(Locate(0, 0));
} else if (t > ymax) {
Select(Locate(0, ymax));
}
}
void ClassEditor::Handle (Event& e) {
if (e.eventType == KeyEvent) {
HandleKeyEvent(e);
} else {
boolean done = false;
do {
switch (e.eventType) {
case DownEvent:
done = HandleDownEvent(e);
break;
case KeyEvent:
done = HandleKeyEvent(e);
break;
}
if (!done) {
Read(e);
}
} while (!done);
}
}
boolean ClassEditor::HandleKeyEvent (Event& e) {
boolean done = false;
if (e.len != 0) {
done = HandleChar(e.keystring[0]);
}
return done;
}
boolean ClassEditor::HandleDownEvent (Event& e) {
boolean done = true;
if (e.target == this) {
switch (e.button) {
case LEFTMOUSE: Select(Locate(e.x, e.y)); done = false; break;
case MIDDLEMOUSE: GrabScroll(e); break;
case RIGHTMOUSE: RateScroll(e); break;
}
} else {
UnRead(e);
}
return done;
}
boolean ClassEditor::HandleChar (char c) {
boolean done = false;
int lines = display->LineNumber(0) - display->LineNumber(ymax) + 1;
switch (c) {
case FirstLine:
BeginningOfText();
ScrollToSelection();
break;
case LastLine:
EndOfText();
ScrollToSelection();
break;
case PrevLine:
BackwardLine();
ScrollToSelection();
break;
case NextLine:
ForwardLine();
ScrollToSelection();
break;
case PageDown:
ForwardPage();
ScrollToSelection();
break;
case PageUp:
BackwardPage(1);
ScrollToSelection();
break;
case HalfPageDown:
ForwardLine(lines/2);
ScrollToSelection();
break;
case HalfPageUp:
BackwardLine(lines/2);
ScrollToSelection();
break;
case ScrollDown:
ScrollBy(1);
break;
case ScrollUp:
ScrollBy(-1);
break;
default:
for (int i = 0; _done[i] != '\0'; ++i) {
if (c == _done[i]) {
_state->SetValue(c);
done = true;
}
}
break;
}
return done;
}